0

Ich habe ein NSTableView in einem schwebenden Fenster, das dynamisch an die arrangedObjects -Eigenschaft einer Instanz eines NSArrayControllers gebunden ist, die dem vordersten Dokumentfenster mit folgendem Code entspricht :NSTableColumn Wertgebunden an den NSArrayController des vordersten Fensters beim Auslösen von Ausnahmen beim Fensterwechsel

NSArrayController *documentSpecificArrayController; // properly set elsewhere 
NSTableColumn *tableColumnToBind; // properly set elsewhere 

[tableColumnToBind unbind:NSValueBinding]; 
[tableColumnToBind bind:NSValueBinding 
       toObject:documentSpecificArrayController 
      withKeyPath:@"arrangedObjects" 
       options:[NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], 
         NSContinuouslyUpdatesValueBindingOption, 
         nil]]; 

Solange das dargestellte Array/die Tabellenansicht leer sind, funktionieren die Dinge gut; Alle verschiedenen Operationen in der Tabelle view/repaired array innerhalb eines Dokuments funktionieren gut. Wenn von einem Dokument mit einem nicht leeren dargestellten Array zu einem Dokument gewechselt wird, für das das dargestellte Array leer ist, wird ein endloser Strom von Ausnahmen ausgelöst.

Fehle ich etwas, das ich tun muss, wenn ich die Bindung beim Wechseln von Fenstern sauber durchtrenne? Etwas anderes? (Gibt es einige spezifische Informationen, die ich weggelassen habe, um meinen Fehler zu diagnostizieren?)

+0

"richtig anderswo" [Zitat benötigt] :-) –

+0

@Joshua Nozzi: Ich wusste * jemand * würde fragen. :) Der Array-Controller ist eine Eigenschaft der Dokumentenklasse, die der Delegierte des neuen obersten Fensters ist, also ist es so gekommen; Die Tabellenspalte ist in einer Tabellenansicht enthalten, die mit einem IBOutlet der Klasse verknüpft ist, in der dieser Code auftritt. Ich habe unabhängig von diesem Ausnahme-Werfen verifiziert, dass beide Variablen gesetzt sind und sich wie erwartet ändern. – Isaac

Antwort

1

Basierend auf Ihrem Kommentar scheint es, dass Sie versuchen, eine Inspektor-Palette oder etwas ähnliches zu erstellen. Ist das wahr? In diesem Fall sollten Sie wahrscheinlich direkt an den Array-Controller des aktiven Dokuments binden, indem Sie mit dem Schlüsselpfad von mainWindow.document.myArrayController eine Bindung an Shared Application herstellen. Ich denke, dass Sie Run-Loop/Timing-Probleme mit Bindungen auftreten und die Verwendung dieser Methode sollte das mindern.

+0

Ich werde in Kürze testen, aber (1) der Anwendungsfall ist so etwas wie eine Inspektor-Palette, (2) macht Sinn mit dem, was ich bisher gesehen habe, und (3) es würde vereinfachen, was eine ziemlich langwierige und chaotische Art war Dinge bis zu einer einfachen Bindung zu verbinden. Gibt es irgendwo in der Dokumentation, dass ich von Anfang an gesehen hätte, wie das geht? – Isaac

+0

Ich weiß nicht, dass dies speziell überall in Apples Zeug dokumentiert ist, aber es ist eine Lösung, die seit den 10,3 Tagen in verschiedenen Cocoa Community-Seiten herumschwebt. Ich benutze es selbst. Vorbehalt: Wenn Sie verschiedene Dokumenttypen verwenden und nicht alle über diesen Schlüsselpfad verfügen, müssen Sie "die Leerzeichen ausfüllen" und nil für den myArrayController-Teil in den nicht kompatiblen Dokumentklassen zurückgeben oder Sie erhalten Schlüsselpfadfehler. –

+0

Zusätzlicher Vorschlag: Setzen Sie einen Array-Controller in die Xib der Palette und binden Sie die Tabelle stattdessen an * it *. Dann binden Sie * den * Inhalt des Array-Controllers an die Sammlung, die der Array-Controller des Docs darstellen soll (über denselben Schlüsselpfad "Trick"), nur mit einem anderen letzten Segment - dem Schlüssel der Sammlung und nicht dem Array-Controller. Das Fenster der Palette sollte eigene Controller besitzen. –

Verwandte Themen