2014-01-20 12 views
7

Ich verwende KVO, um ein Kontrollkästchen zu beobachten und um einen Eingabebereich für Details basierend auf dem Status des Kontrollkästchens zu aktivieren oder zu deaktivieren. (Dh, wenn das Kontrollkästchen aktiviert ist, wird der Detailbereich aktiviert, sonst nicht) So etwas wie:Bindung an das Negativ einer booleschen Eigenschaft mit KVO

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

Mein Problem ist, dass jetzt würde ich dies stattdessen ändern möge einstellen detailInputArea ‚s hidden Eigenschaft, zum Anzeigen/Verbergen Sie die Ansicht abhängig vom Status des Kontrollkästchens. Das Problem ist, dass dies eine inverse Logik erfordern würde. Mit anderen Worten, wenn Sie enabled, auf true setzen, bedeutet dies, dass die Ansicht aktiviert ist (kann Eingaben akzeptieren), während false bedeutet, dass dies nicht möglich ist. Mit hidden, bedeutet "true" jedoch, dass die Ansicht ausgeblendet ist, andernfalls "false". Offensichtlich würde dies nicht funktionieren, da sich die Ansicht verbergen würde, wenn das Kontrollkästchen aktiviert ist (die Eigenschaft enabled ist wahr).

Gibt es eine Möglichkeit, diese Bindung zu ändern, basierend auf der Umkehrung der Eigenschaft, die sie beobachtet, und/oder gibt es einen besseren Weg, um das zu erreichen, was ich hier versuche?

Antwort

12

Ja, das ist Teil des Wörterbuchs für Optionen. Die Schlüssel/Wert-Bindung ermöglicht die Transformation des gebundenen Werts vor der Festlegung über eine NSValueTransformer, und Sie können den Transformator in den Optionen für die Bindung angeben.

Die NSValueTransformer Klasse bietet some default, named transformers. In diesem Fall sind Sie an NSNegateBooleanTransformerName interessiert.

So ist die Bindung Sie aussehen wollen wie:

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

Ugh, ich verwirrende Dinge wie '' NSValueTransformerNameBindingOption mit 'NSValueTransformerBindingOption' HATE. Es ist viel zu oft, dass ich zu solchen Zeiten ... nach meiner Waffe suchen möchte. –

1

Hier Josh Caswell's answer in Swift 3:

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