Frage

in meiner Anwendung habe ich eine sehr einfache Bindung. Ich habe eine NSMutableArray zu einem NSArrayController gebunden. Die Steuerung selbst ist gebunden an eine ComboBox, und es zeigt sich die Inhalte der NSMutableArray. Funktioniert.

Das Problem ist: Der Inhalt des Array ändern. Wenn der Benutzer einige Anpassungen der App macht lösche ich alle Elemente in der NSMuteableArray und füllen Sie es mit neuen und anderen Artikeln.

Aber die Bindung von NSMutableArray <-> NSArrayController <->. NSComboBox nicht aktualisiert

Egal, ob ich alle Objekte aus dem Array der ComboBox noch die gleichen Elemente zeigt.

Was ist hier falsch? Ist mein Ansatz falsch oder muss ich nur die Bindung sagen, an sich selbst zu aktualisieren? Ich habe nicht herausfinden, wie das zu tun.

War es hilfreich?

Lösung

Sie sind wahrscheinlich „Bearbeiten des Array hinter der Steuerung zurück“, die den KVO-Mechanismus untergräbt.

Sie haben gesagt:

  

Ich habe eine NSMutableArray an einen NSArrayController gebunden ist.

Wie? Wo lebt das Array? In einem Dokument, konform erreichbar über ein KVC / KVO -myArray / -setMyArray: Satz von Accessoren

Ich wette Sie die „myArray“ Ivar zu -removeAllObjects direkt zu sagen, nicht wahr? Wie werden diese KVC / KVO Accessoren "wissen" das Array verändert hat?

Die Antwort ist, sie dies nicht tun. Wenn Sie wirklich das gesamte Array zu ersetzen, werden Sie Ihr Dokument sagen (oder wer auch immer besitzt das Array) -setMyArray: auf ein ganz neues Array. Dadurch werden die richtigen KVO Anrufe auslösen.

... aber dann, die Sie nicht wirklich eine änderbare Array benötigen, tun Sie? Wenn Sie nur einzelne Elemente im Array ersetzt werden soll, sollten Sie indizierte Accessoren verwenden:

(Dokumentation - siehe die Sammlung Accessor Patterns für To-Many Abschnitt Eigenschaften) http://tinyurl.com/yb2zkr5

Andere Tipps

Versuchen Sie, diese (mit ARC / OS X 10.7):

in Header-Datei definiert die arrayInstance und die Arraycontroller

 @property (weak) IBOutlet NSArrayController *arrayController;
 @property (strong) NSArray *arrayInstance; // for the array instance

dann bei der Umsetzung

 @synthesize arrayController = _arrayController;
 @synthesize arrayInstance = _arrayInstance;

 _arrayInstance = .......  // What ever the new array will be
 [_arrayController setContent:_arrayInstance];

Damit wird den Arraycontroller zwingen, den Inhalt zu aktualisieren und korrekt angezeigt werden.

Eine weitere, aber 2 Codezeile Lösung sei:

 [self willChangeValueForKey:@"arrayInstance"];
 _arrayInstance = .......  // What ever the new array will be
 [self didChangeValueForKey:@"arrayInstance"];

Denken Sie die ersten Blicke mehr auf der Hand, die zweite mehr KVO-like.

KVC / KVO Compliance scheint das Problem zu sein. Sie sollten das neue Array erstellen und die Referenz mit dem neuen Objekt aktualisieren, indem die erzeugten Zugriffsmethoden verwenden. Sie können sonst feuern KVO-Meldungen über das Array die Bindungen informieren aktualisiert werden, dass der Inhalt des Arrays geändert hat.

Christian

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