Frage

Ich habe einige Probleme den Inhalt eines NSArrayController in zwei Fenstern definiert in verschiedenen XIBs angezeigt wird.

In meinem Hauptfenster (in MainMenu.xib), ich habe ein NSTableView, die zu einem NSArrayController gebunden ist

In meinem zweiten XIB, habe ich ein anderes Fenster, das eine NSTableView enthält. Ich habe einen neuen NSArrayController und band die Tabelle zu dem Inhalt dieses NSArrayController.

Beide NSArrayControllers sind verpflichtet, auf die exakt gleiche NSArray.

Alles ist zunächst in Ordnung, aber das Problem ist, dass, wenn ein Objekt in das Array mit den NSArrayController im Hauptfenster hinzugefügt wird, wird das Sekundärfensters Blick auf die Daten nicht aktualisiert. Dies ist höchstwahrscheinlich, weil er nicht weiß, dass es selbst aktualisieren muss, da seine NSArrayController nicht das neue Objekt hinzuzufügen, verwendet wurden.

Was würde Ich mag zu tun, die genau die gleiche Instanz von NSArrayController in beiden Fenstern verwenden. Auf diese Weise, wenn ein Objekt in das Array hinzugefügt wird, werden beide Ansichten über die Änderung informiert werden.

Das Problem ist, dass ich nicht herausfinden kann, wie dies im Interface Builder zu tun. Ich kann keinen NSArrayController an einem anderen NSArrayController binden (I einen Laufzeitfehler erhalten, dass es nur zu einer NSArray gebunden werden kann). Anschließen des NSArrayController zum NSArrayController Mitglied der Datei Besitzer entweder nicht helfen, denn das wird auslöschen nur die NSArrayController, dass ich es verwenden möchten.

Ich glaube, ich könnte die Bindungen auf mich im Code festgelegt, aber es scheint, als ob es besser wäre, Interface Builder zu verwenden, wenn möglich. Gibt es eine Möglichkeit, dies im Interface Builder zu tun, oder vielleicht ein besserer Weg, dies alles zusammen einzurichten?

Update: Als Reaktion auf Chucks Antwort und Kommentare, habe ich versucht, die folgenden: -Gebundenen der Tabelle Inhalt meiner NSTableView den arrangedObjects des NSArrayController Mitglied (wenn ich die NSArrayController selbst verwendet, erscheint ein Fehler im Protokoll: „[NSArrayController COUNT]: Unbekannter Selektor an Instanz gesendet“) -Gebundenen jede Spalte in der Tabelle Datei-Besitzer, mit einem Modell Key Path of arrayController.arrangedObjects.propertyName

Das hat zur Folge noch nicht in die Inhalte der Tabelle immer Updates. Ich denke, das liegt daran, dass ich zu dem arrangedObjects des NSArrayController bin Bindung, anstatt auf den NSArrayController selbst. Aber, wenn ich direkt an die NSArrayController binden, das gibt mir Fehler.

Normalerweise würde ich meine NSArrayController von der „Bind zu“ wählen ComboBox-, Verwendung arrangedObjects als Controller-Key, und die Eigenschaft, sich als Modell Key Path. Ich bin mir nicht sicher, wie das äquivalent, dass in diesem Fall zu tun -. Wenn ich kann überhaupt

Habe ich etwas falsch in dem Prozess oben?

War es hilfreich?

Lösung

Die beste Option, die ich in der Lage bin, mit zu kommen ist den zweiten NSArrayController zu benachrichtigen, dass das Array es ist die Verwaltung durch den Aufruf rearrangeObjects: auf sie verändert hat. Das scheint klobig, aber es funktioniert.

Andere Tipps

Was ist mit ihnen auf, als Proxy-Objekte in IB dann die Einstellung der tatsächlichen in Code, vielleicht in AppDelegate Instanziierung?

Sie können beide NSArrayControllers erhalten zu aktualisieren über KVO, wenn das Array hinzugefügt wird. Der Trick ist, dass Sie auf das Array in einem KVO konform.

zu beachten haben und füge

Sie würden einige Objekt möchten, dass die Array besitzt, nennen wir es „Modell“. Das Array hat eine Taste auf dem Objekt sein, lassen Sie sich den Schlüssel „contentArray“ nennen. Als nächstes, wenn Sie aus der Addition sind zu / entfernen, sollten Sie es tun, indem zuerst mutableArrayForKey auf „Modell“ zu bekommen „contentArray“ aufrufen. Dann wird die Hinzufügen / Entfernen aus dem Array sollten funktionieren, zum Beispiel:

Controller1 ist verpflichtet, self.model.contentArray

Controller2 ist verpflichtet, self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

Alternativ können Sie die KVO-Benachrichtigungen tun manuell wie folgt aus:

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}

Es gibt keinen Grund, zwei Array-Controller hat, sollte einen Blick nicht aktualisieren, wenn Sie durch einen anderen aktualisieren. Wenn es nicht geschieht, es klingt wie Ihre KVO Benachrichtigungen irgendwo verloren zu werden. Höchstwahrscheinlich werden Sie direkt ein Array Bearbeitung (in einer add: Methode der NSArrayController Unterklasse, vielleicht?), Ohne die richtigen Änderungsbenachrichtigungen zu senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top