Come devo rimuovere tutti gli elementi da un NSTableView controllato da NSArrayController?

StackOverflow https://stackoverflow.com/questions/646787

  •  22-07-2019
  •  | 
  •  

Domanda

Sto usando un NSArrayController , NSMutableArray e NSTableView per mostrare un elenco dei miei oggetti personalizzati (anche se questa domanda probabilmente si applica se stai solo mostrando un elenco di oggetti NSString vaniglia).

In vari momenti, devo cancellare il mio array e aggiornare i dati dalla mia fonte di dati. Tuttavia, la semplice chiamata di removeAllObjects sul mio oggetto NSMutableArray non attiva gli aggiornamenti KVO, quindi l'elenco sullo schermo rimane invariato.

NSArrayController ha no removeAllObjects disponibile, il che sembra davvero strano. (Ha addObject , che uso per aggiungere gli oggetti, assicurando che KVO sia attivato e che l'interfaccia utente sia aggiornata.)

Il modo più pulito in cui sono riuscito a far sì che ciò accada correttamente è:

[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];

... quindi devo fare manualmente la notifica KVO (questo è nella mia classe dell'app di test, che contiene la proprietà myArray , che è NSMutableArray , come menzionato.)

Sembra sbagliato - esiste un modo migliore? Dal mio google 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 mi sembra ancora più spiacevole. Almeno la mia soluzione è almeno marginalmente autocompassante.

Apple non ha notato che a volte le persone potrebbero voler svuotare un controllo elenco gestito tramite un oggetto NSArrayController ? Sembra abbastanza ovvio, quindi penso che mi debba sfuggire qualcosa ...

A parte: ovviamente, se aggiungo nuovi elementi all'array (tramite NSArrayController ), questo innesca un aggiornamento KVO con NSArrayController / NSTableView , ma:

  1. A volte non inserisco alcun elemento nell'elenco, perché non ce ne sono. Quindi vedi solo i vecchi oggetti.
  2. Comunque è un po 'schifoso.
È stato utile?

Soluzione

Non rimuovi elementi da una vista tabella. Non ha alcun oggetto & # 8212; mostra solo gli oggetti di un altro oggetto.

Se si associa l'associazione dell'array di contenuto del controller dell'array a una proprietà dell'array di qualche altro oggetto, allora si dovrebbe lavorare con quella proprietà dell'oggetto. Utilizza [[object mutableArrayValueForKey: @ " property "] removeAllObjects] .

Se, d'altra parte, non hai associato l'associazione dell'array di contenuti del controller dell'array, devi interagire direttamente con il suo content . Utilizza [[arrayController mutableArrayValueForKey: @ " content "] removeAllObjects] . (Potresti anche lavorare con organizzatoOggetti anziché contenuto . Se uno non funziona, prova l'altro & # 8212; Ho sempre fatto le cose solo nel primo modo, vincolante il controller di array su qualcos'altro.)

Altri suggerimenti

Anche questo problema è stato risolto in questo modo:

NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];

Swift

@IBOutlet var acLogs: NSArrayController!

acLogs.removeObjects(acLogs.content as! [AnyObject])

ha funzionato per me.

Soluzione in Swift:

if let ac = arrayController
{
    let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
    ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}

Solo un aggiornamento che funziona in Swift 4:

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top