¿Cómo debo eliminar todos los elementos de un NSTableView controlado por NSArrayController?

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

  •  22-07-2019
  •  | 
  •  

Pregunta

Estoy usando un NSArrayController , NSMutableArray y NSTableView para mostrar una lista de mis propios objetos personalizados (aunque esta pregunta probablemente se aplique si solo está mostrando una lista de objetos NSString de vainilla también.

En varios momentos, necesito borrar mi matriz y actualizar los datos de mi fuente de datos. Sin embargo, solo llamar a removeAllObjects en mi objeto NSMutableArray no activa las actualizaciones de KVO, por lo que la lista en pantalla permanece sin cambios.

NSArrayController tiene no removeAllObjects método disponible, lo que parece realmente extraño. (Tiene addObject , que utilizo para agregar los objetos, asegurando que el KVO se active y la IU se actualice).

La forma más limpia que he logrado que esto suceda correctamente es:

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

... así que tengo que hacer la notificación KVO manualmente (esto está en mi clase de aplicación de prueba, que contiene la propiedad myArray , que es NSMutableArray , como se mencionó.)

Esto parece incorrecto, ¿hay una mejor manera? Desde mi búsqueda en Google, parece que algunas personas están confundidas por la falta de removeAllObjects en NSArrayController , pero no han visto ninguna solución mejor.

He visto esta solución:

[self removeObjectsAtArrangedObjectIndexes:
  [NSIndexSet indexSetWithIndexesInRange:
    NSMakeRange(0, [[self arrangedObjects] count])]];

pero esto me parece aún más desagradable. Al menos mi solución es al menos marginalmente autodocumentada.

¿Apple no se dio cuenta de que a veces las personas querrían vaciar un control de lista que se administra a través de un objeto NSArrayController ? Esto parece algo obvio, así que creo que me falta algo ...

Aparte: por supuesto, si agrego nuevos elementos a la matriz (a través de NSArrayController ), esto desencadena una actualización de KVO con NSArrayController / NSTableView , pero:

  1. A veces no pongo ningún elemento en la lista, porque no hay ninguno. Así que solo ves los elementos antiguos.
  2. Esto es un poco asqueroso de todos modos.
¿Fue útil?

Solución

No elimina elementos de una vista de tabla. No tiene ningún elemento & # 8212; solo muestra los elementos de otro objeto.

Si vincula el enlace de la matriz de contenido del controlador de matriz a una propiedad de matriz de algún otro objeto, entonces debería estar trabajando con esa propiedad de ese objeto. Utilice [[object mutableArrayValueForKey: @ " property "] removeAllObjects] .

Si, por otro lado, no ha vinculado el enlace de la matriz de contenido del controlador de matriz, entonces necesita interactuar directamente con su content . Utilice [[arrayController mutableArrayValueForKey: @ " content "] removeAllObjects] . (También podría trabajar con arrancadoObjetos en lugar de content . Si uno no funciona, pruebe con el otro & # 8212; Solo he hecho las cosas de la primera manera, vinculando el controlador de matriz a otra cosa.)

Otros consejos

También tuve este problema y lo resolvió de esta manera:

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

Swift

@IBOutlet var acLogs: NSArrayController!

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

funcionó para mí.

Solución en Swift:

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

Solo una actualización que funciona en Swift 4:

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top