Ich habe zwei Fenster: Fenster A wird von NIB geladen; und Fenster B wird programmgesteuert erstellt.
Beide Fenster haben eine NStextView: Der attributedString der Textansicht in Window A ist an die Eigenschaft text
eines Modells gebunden, die IB verwendet ; während der attributedString der Textansicht in Window B mit text
method an die -[NSObject bind:toObject:withKeyPath:options:]
-Eigenschaft des Modells gebunden ist.
Hier ist das Seltsame: Die Textansicht in Fenster B ist zwar an die obj.text
gebunden, aber die Änderungen in der Textansicht werden nie auf obj.text
aktualisiert. Aber, wenn ich Änderungen in der Textansicht von Fenster A vorgenommen habe, werden die obj.text
und die Textansicht in Fenster B entsprechend aktualisiert.
Ich denke also, die -[NSObject bind:toObject:withKeyPath:options:]
-Methode ist nur für eine einseitige Bindung. Ich konnte in den Kakao-Dokumentationen keine klare Erklärung finden. Hat jemand Erfahrung mit diesem Problem? Wie implementieren Sie bidirektionale Bindung in Code?
Cocoa-Bindungen sind von Natur aus zweiseitig, aber bestimmte Verhaltensweisen (wie die kontinuierliche / Live-Aktualisierung von Textfeldern) erfordern die Festlegung bestimmter Optionen. In IB sollten Sie sicherstellen, dass das Kontrollkästchen "Continuously Updates Value" aktiviert ist. Um gleichartiges Verhalten programmgesteuert zu erhalten, müssen Sie options
für die Bindung angeben. Das könnte etwa so aussehen:
Es ist erwähnenswert, dass es beim Überprüfen einer Bindung programmatisch sinnvoll ist, eine entsprechende Bindung in IB zu überprüfen und sicherzustellen, dass Sie alle die gleichen Einstellungen an die programmatische Bindung übergeben. Zum Beispiel sehe ich in IB, dass die Optionen "Bearbeiten von mehreren Werteauswahl", "Bedingungssätze editierbar" und "Erhöhungen für nicht anwendbare Schlüssel" alle standardmäßig für eine NSTextView-Attributierte-String-Bindung markiert sind. Das würde bedeuten, dass unsere programmatische Bindung wahrscheinlich wirklich aussehen sollte:
%Vor%Ja, bind: toObject: withKeyPath: Optionen: ist eine Möglichkeit und keine Option kann dies beeinflussen. Dies ist nicht das Gleiche wie Sie in der .nib-Datei binden. Wie immer hat Apple vergessen, in seinen Dokumenten so einfach zu erwähnen. Die einfachste Lösung besteht darin, gleichzeitig eine umgekehrte Bindung zu erstellen, wenn Sie eine Vorwärtsbindung erstellen. Dies wird NICHT Ihren Code bei der Zuweisung des Werts loop loop. Hier ist das Beispiel mit Benutzervorgaben:
%Vor%Tags und Links cocoa binding cocoa-bindings nstextview