2014-01-20 1 views
7

Я использую KVO для просмотра флажка и для включения или отключения области ввода данных в зависимости от состояния флажка. (Т.е. если флажок установлен, область детали включена, в противном случае нет) что-то вроде:Привязать к отрицанию булевого свойства с помощью KVO

[self.detailInputArea bind:@"enabled" toObject:self withKeyPath:@"enabledCheckbox" options:nil]; 

Моя проблема заключается в том, что теперь я хотел бы изменить это вместо того, чтобы установить detailInputArea «s hidden свойство, чтобы показать/скрыть представление в зависимости от состояния флажка. Проблема в том, что для этого потребуется обратная логика. Другими словами, при установке его enabled, true означает, что представление включено (может принимать ввод), а false означает, что оно не может. Однако с hidden, true означает, что представление скрыто, а false в противном случае. Очевидно, это не сработает, так как представление скроется, когда флажок установлен (свойство enabled верно).

Есть ли способ изменить это обязательство на действие, основанное на обратном объекте, которое он наблюдает, и/или есть лучший способ выполнить то, что я пытаюсь сделать здесь?

ответ

12

Да, это часть того, для чего нужен словарь параметров. Связывание ключевого значения позволяет преобразовать связанное значение до его установки через NSValueTransformer, и вы можете указать трансформатор в параметрах привязки.

Класс NSValueTransformer обеспечивает some default, named transformers. В этом случае вас будет интересовать NSNegateBooleanTransformerName.

Таким образом, связывание вы хотите будет выглядеть следующим образом:

[self.detailInputArea bind:@"hidden" 
        toObject:self 
       withKeyPath:@"enabledCheckbox" 
        options:@{NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName}]; 
+1

Тьфу, я НЕНАВИЖУ запутанные вещи, как '' NSValueTransformerNameBindingOption с 'NSValueTransformerBindingOption'. Слишком часто, что в такие моменты я ... хочу посмотреть ... для моего пистолета. –

1

Вот Josh Caswell's answer в Swift 3:

detailInputArea.bind(NSHiddenBinding, 
        to: self, 
        withKeyPath: #keyPath(enabledCheckbox), 
        options: [NSValueTransformerNameBindingOption: NSValueTransformerName.negateBooleanTransformerName])