2012-04-14 7 views
1

Ich habe eine benutzerdefinierte Klasse (Unterklasse von NSView - sich tatsächlich einen modifizierten Editor sagen, aber nicht eine Unterklasse von NSTextView), die ich (I definitiv nicht tun kann es über Interface Builder), wie zu einem NSArrayController programmatisch bin Bindung dies:Cocoa-Bindung programmgesteuert + Wert nicht aktualisiert?

[myEditor bind:@"string" 
    toObject:myController 
    withKeyPath:@"selection.content" 
     options:nil]; 

die oben genannten Arbeiten, aber wenn der Wert geändert wird, wird es nicht auf meine NSArrayController aktualisiert - es ist, als ob es nicht „kleben“.

Ich habe versucht sogar, die options unten verwenden, aber ohne Erfolg:

NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES],NSContinuouslyUpdatesValueBindingOption, 
         [NSNumber numberWithBool:YES],NSAllowsEditingMultipleValuesSelectionBindingOption, 
         [NSNumber numberWithBool:YES],NSConditionallySetsEditableBindingOption, 
         [NSNumber numberWithBool:YES],NSRaisesForNotApplicableKeysBindingOption, 
         nil]; 

Irgendwelche Ideen?

+0

Wie haben Sie es in Ihrer benutzerdefinierten Ansicht implementiert? – ughoavgfhw

+0

@ughoavgfhw Es ist eine Ansicht mit der Scintilla-Komponente (für Cocoa) - also, es ist keine Maßanfertigung. Es ist in der offiziellen Version von Scintilla enthalten. –

Antwort

6

Eine Klasse muss Unterstützung für Bindungen implementieren. Die Ansichts- und Zellklassen, die mit Cocoa ausgeliefert werden, implementieren im Allgemeinen eine bestimmte Reihe von Bindungen. Ob benutzerdefinierte Unterklassen dies tun oder nicht, hängt vom Implementierer ab. Wenn eine Klasse keine spezifische Unterstützung für eine Bindung implementiert hat, fällt eine Anforderung -bind:... an NSObject. Diese Implementierung ist jedoch ziemlich begrenzt. Es beobachtet den Schlüsselpfad für den observableController und aktualisiert über KVC die Eigenschaft des Empfängers, der denselben Namen wie die Bindung hat. Aber es tut nicht gehen in die andere Richtung. Das bedeutet, dass Änderungen an der Eigenschaft des Empfängers nicht über den Schlüsselpfad an ObservableController weitergeleitet werden.

Um dies weniger abstrakt mit Ihrem Beispiel zu machen. Wenn die Klasse myEditor die Unterstützung für eine "String" -Bindung nicht spezifisch implementiert hat, dann wird die Implementierung NSObject[myController addObserver:<some private observer object> forKeyPath:@"selection.content" options:<...> context:<...>] tun.

Wenn das private Observer-Objekt eine Änderungsbenachrichtigung empfängt, wird [myEditor setValue:[myController valueForKeyPath:@"selection.content"] forKey:@"string"] ausgeführt.

NSObject wird jedoch keinen Versuch machen, myEditor s "String" -Eigenschaft zu beobachten, noch rufen Sie [myController setValue:<...> forKeyPath:@"selection.content"]. Weitere Informationen zum Implementieren der Unterstützung für eine Bindung finden Sie unter

+0

Vielen Dank für Ihre Antwort! :-) –

Verwandte Themen