Sto utilizzando uno NSArrayController
, NSMutableArray
e NSTableView
per mostrare un elenco di oggetti personalizzati (sebbene questa domanda probabilmente si applica se si sta solo visualizzando un elenco di oggetti vaniglia NSString
).Come rimuovere tutti gli elementi da un NSTableView controllato da NSArrayController?
In vari punti nel tempo, ho bisogno di cancellare la mia matrice e aggiornare i dati dalla mia fonte di dati. Tuttavia, chiamare semplicemente removeAllObjects
sull'oggetto NSMutableArray
non attiva gli aggiornamenti KVO, pertanto l'elenco sullo schermo rimane invariato.
NSArrayController
ha noremoveAllObjects
metodo disponibile, che sembra davvero strano. (Esso ha addObject
, che io uso per aggiungere gli oggetti, garantendo la KVO viene attivato e l'interfaccia utente è aggiornato.)
Il modo più pulito sono riuscito a causare questo accada correttamente è:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
... così sto tipo di dover fare la notifica KVO manualmente me stesso (questo è nel mio test di classe app, che contiene la proprietà myArray
, che è NSMutableArray
, come detto.)
questo sembra sbagliato - è c'è un modo migliore? Dal mio googling sembra che alcune persone siano confuse dalla mancanza di removeAllObjects
in NSArrayController
, ma non hanno visto soluzioni migliori.
ho visto questa soluzione:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
ma questo sembra ancora più spiacevole per me. Almeno la mia soluzione è almeno marginalmente autodocumentante.
Apple non ha notato che a volte le persone potrebbero voler svuotare un controllo elenco gestito tramite un oggetto NSArrayController
? Questo mi sembra ovvio, quindi penso che mi debba mancare qualcosa ...
A parte: ovviamente, se aggiungo nuovi elementi all'array (tramite NSArrayController
), questo innesca un aggiornamento KVO con lo NSArrayController/NSTableView
, ma :
- A volte non inserisco alcun elemento nell'elenco, perché non ce ne sono. Quindi vedi solo i vecchi oggetti.
- Questo è comunque un po 'schifo.
Grazie - funziona. Ho cambiato il mio codice originale nella mia domanda a: [[self mutableArrayValueForKey: @ "myArray"] removeAllObjects]; e funziona perfettamente. Molto più pulito Hai scritto mutableArrayValueForKey errato btw - risolvilo e lo contrassegnerò come risposta accettata. :-) – Slacker
Il tuo metodo funziona perfettamente quando ArrayController è limitato a un array. Ma non funziona quando ArrayController non è limitato a un array. L'array 'content' che si ottiene da ArrayController è un' NSArray' non 'NSMutableArray'. Basta usare il metodo di ArrayController per cancellare il contenuto: 'NSRange range = NSMakeRange (0, [[anArrayController arrangedObjects] count]); [anArrayController removeObjectsAtArrangedObjectIndexes: [NSIndexSet indexSetWithIndexesInRange: range]];' – Quincy
@Quincy '' 'NSRange'' 'soluzione è significativamente più veloce della risposta originale o' '' [anArrayController removeObjects: [anArrayController arrangedObjects]] '' '. Grazie! – bdunagan