0

Ich habe eine NSMutableArray (mit NSMutableDictionary Instanzen) bekam gebunden an eine NSArrayController (die NSArrayController wiederum an NSTableView Spalten gebunden).Der beste Weg, um einen NSArrayController zu einem NSMutableArray verwaltet hinzufügen/entfernen

Was ist die Kakao- und KVO- freundliche Art und Weise von, programmatisch:

  • ein neues leeres Objekt Hinzufügen (NSMutableDictionary) auf das Array?
  • das aktuell ausgewählte Objekt entfernen? (Nach dem Entfernen das vorherige Element - falls vorhanden - sollte gewählt werden)

Ich habe immer dies in einer Art und Weise getan, kann ich nicht besonders gut gefällt - und ich bin sicher, es ist nicht der beste Weg, um (zu viele Codezeilen für etwas so einfaches: in Cocoa, das eine falsche Sicht auf das Thema anzeigt :-)).


Mein Code (ein ziemlich übertrieben, tatsächlich):


Zusätzlich zu dem Array

NSMutableArray* oldParams = [paramsArray mutableCopy]; 

[oldParams addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Parameter",@"Parameter",@"",@"Value", nil]]; 
[self setParamsArray:oldParams]; 

[paramsController setSelectionIndex:[paramsArray count]-1]; 

Entfernen derzeit sele cted Objekt aus dem Array

if ([paramsArray count]>0) 
{ 
    int s = [paramsController selectionIndex]; 

    NSMutableArray* oldParams = [paramsArray mutableCopy]; 

    [oldParams removeObjectAtIndex:s]; 

    [self setParamsArray:oldParams]; 

    if (s<=[paramsArray count]-1) 
     [paramsController setSelectionIndex:s]; 
    else 
     [paramsController setSelectionIndex:[paramsArray count]-1]; 
} 

Also, was auf, dass Ihre Meinungen sind?

Antwort

1

Sie müssen sich Ihr Array als Backing Store des Controllers vorstellen und es für Sie verwalten.

Hinzufügen eines Objekts:

[[self accountsArrayController] addObject:accountDictionary]; 

die aktuell ausgewählte Objekt entfernen:

[[self accountsArrayController] remove:nil]; 

Sie werden eine andere Linie oder zwei schreiben müssen, dass frühere Element ausgewählt zu machen, aber das ist eine Übung, die ich überlassen Sie Ihnen.

+0

Ich bekomme ein 'Programm empfangenes Signal:" EXC_BAD_ACCESS "' in beiden Fällen ... Irgendwelche Ideen? –

+0

@ Dr.Kameleon: Möglicherweise. Stellen Sie sicher, dass bei jeder vorherigen Verwendung des Array-Controllers die Verwendung von 'setContent:' nicht enthalten ist (obwohl ich festgestellt habe, dass die Verwendung von Bindings dazu am Anfang funktioniert). Und natürlich sollte Ihr Backing-Array ein gültiges, zugewiesenes 'NSMutableArray' sein. – trudyscousin

+0

Mein Hintergrund-Array ist absolut gültig. Die Sache ist, ich kann jede Art von Verarbeitung direkt auf das Array tun, aber Ihre Ansatz (mit dem Controller direkt mit dem Array zu handhaben) hat nie wirklich für mich gearbeitet ... –

2

Vorausgesetzt, dass der Array-Controller an eine Eigenschaft mit dem Namen paramsArray für ein Objekt gebunden ist, empfiehlt es sich, die Schlüsselwertcodierung indexed accessors für die Klasse dieses Objekts zu definieren. Verwenden Sie dann diese Accessoren, um die von der Eigenschaft dargestellte to-many-Beziehung KVO-konform zu ändern.

Implementieren Sie beispielsweise -insertObject: inParamsArrayAtIndex: und fügen Sie dann ein Objekt hinzu. Wenn Sie die Bequemlichkeit der Methode -addObject: von NSMutableArray mögen, können Sie eine Methode -addObjectToParamArray schreiben, die an -insertObject weitergibt: inParamsArrayAtIndex :.

Übrigens ist "paramsArray" ein armer Name für eine Eigenschaft. Der Eigenschaftsname sollte nicht den für die Implementierung verwendeten Typ codieren.Wenn Sie sich die Vorlagen für die indizierten Accessor-Namen ansehen, werden Sie sehen, dass Apple erwartet, dass viele Beziehungseigenschaften nur ein Plural-Nomen wie "params" (kein "Array") ist. Zum Beispiel ist -paramsAtIndexes: besser als -paramsArrayAtIndexes :.