Ich habe ein Fenster mit einem NSTextField (in Snow Leopard), das ich an eine NSString-Funktion in meiner WindowController-Klasse gebunden habe. Diese Zeichenfolge kombiniert Informationen über die Auswahl und Zählung meiner Tabellenansicht, die von meinem Array-Controller bereitgestellt werden. Es erhält einen Anfangswert, "0 0"
, wird jedoch nie aktualisiert, wenn sich die Auswahl oder die Anzahl ändert. Die Bindung sieht wie folgt aus (Datei-Besitzer ist MyWindowController):Warum sind meine Cocoa-Bindungen gebrochen?
I umgesetzt + (NSSet *)keyPathsForValuesAffecting<key>
(siehe unten), aber die Bindung nie Updates, auch wenn die Gesamtzahl und Auswahl Änderung der Array-Controller.
(Zusätzliche Fehlerbehebung durchgeführt) Ich hatte ursprünglich die Display Pattern Value Bindung des NSTextField verwendet, aber ich brauchte kompliziertere Logik als diese Bindung geboten. Ich habe dann angefangen, die Auswahl zu lesen, die Ereignisse des TableView geändert/geändert hat, die den Inhalt des Array-Controllers anzeigt und die Display Pattern Value-Bindungen dynamisch ändert, aber das fühlte sich wie ein Hack an und war zu kompliziert.
Ich bin mir sicher, dass ich etwas vermisse, aber ich kann nicht sagen, was. Hat jemand irgendwelche Ideen? Ich habe die Dokumentation von Key-Value-Observing von Apple gelesen, und das scheint alles zu sein, was nötig ist. Ich habe überprüft, und meine keyPathsForValuesAffectingMyString
wird aufgerufen, aber myString
wird nur einmal aufgerufen. Ich habe meinen Code unten destilliert (aktualisiert x3).
aktualisieren 1/21
Ich versuche immer noch Einstecken entfernt, dies herauszufinden. Wenn ich addObserver
bis self
für die ArrayController-Schlüsselpfade, die Benachrichtigungen ausgelöst werden, wie erwartet, so ist meine Schlüsselpfade und der Schlüsselwert Beobachtungsmechanismus in Ordnung. Wenn ich [self didChangeValueForKey:@"myString"];
innerhalb meiner observeValueForKeyPath
-Methode für die gleichen Schlüssel aufrufen, wird die Bindung immer noch nicht aktualisiert, was zu der Annahme führt, dass es sich eher um ein Bindungsproblem als um ein KVO-Problem handelt. Ich werde mehr auf die Bindungen Mechanismus zu lesen up ...
@interface MyWindowController : NSWindowController {
IBOutlet NSArrayController *arrayController;
}
- (NSArrayController *)arrayController;
- (NSString *)myString;
@end
@implementation MyWindowController
+ (NSSet *)keyPathsForValuesAffectingMyString {
return [NSSet setWithObjects:
@"arrayController.arrangedObjects",
@"arrayController.selection",
nil];
}
- (NSArrayController *)arrayController {
return arrayController;
}
- (NSString *)myString {
// Just as an example; I have more complicated logic going on in my real code
return [NSString stringWithFormat:@"%@, %@",
[arrayController valueForKeyPath:@"[email protected]"],
[arrayController valueForKeyPath:@"[email protected]"]];
}
@end
Sind Sie auf Mac OS 10.5 ausgerichtet? –
10.6, Snow Leopard, und ich bin nicht besorgt über die Rückwärtskompatibilität. – Dov
Setzen Sie einen Haltepunkt auf "-arrayController" und starten Sie Ihre App. Die ersten Male, die es genannt wird, was ist der Wert von 'arrayController?' –