2009-03-14 10 views
7

Estoy usando NSArrayController, NSMutableArray y NSTableView para mostrar una lista de mis propios objetos personalizados (aunque esta pregunta probablemente se aplica si solo está mostrando una lista de objetos NSString vainilla también).¿Cómo debo eliminar todos los elementos de un NSTableView controlado por NSArrayController?

En varios momentos, necesito limpiar mi matriz y actualizar los datos de mi fuente de datos. Sin embargo, simplemente llamando al removeAllObjects en mi objeto NSMutableArray no se activan las actualizaciones de KVO, por lo que la lista en la pantalla permanece sin cambios.

NSArrayController tiene noremoveAllObjects método disponible, que parece realmente extraño. (Se tiene addObject, que utilizo para agregar los objetos, lo que garantiza el MVA se activa y la interfaz de usuario está actualizada).

La manera más limpia que he logrado hacer que esto suceda es correcta:

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

... así que estoy tipo de tener que hacer la notificación MVA manualmente a mí mismo (esto es, en mi clase de aplicación de prueba, que contiene la propiedad myArray, que es NSMutableArray, como se ha mencionado.)

esto parece mal - es hay una mejor manera? Desde mi 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 se ve aún más desagradable para mí. Al menos mi solución es, al menos marginalmente, autodocumentada.

¿Apple no se dio cuenta de que a veces las personas pueden querer vaciar un control de lista administrado a través de un objeto NSArrayController? Esto parece bastante obvio, por lo que creo que debo estar perdiendo algo ...

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

  1. A veces no pongo ningún elemento en la lista, porque no hay ninguno. Entonces solo ves los elementos viejos.
  2. Esto es un poco asqueroso de todos modos.

Respuesta

16

No elimina elementos de una vista de tabla. No tiene ningún elemento; solo muestra los artículos de otro objeto.

Si enlazó el enlace de 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. Use [[object mutableArrayValueForKey:@"property"] removeAllObjects].

Si, por otro lado, no ha vinculado el enlace de 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 arrangedObjects en lugar de content. Si uno no funciona, intente con el otro; solo he hecho cosas de la primera manera, vinculando el controlador de array a otra cosa.)

+0

Gracias - eso funciona. Cambié mi código original en mi pregunta a: [[self mutableArrayValueForKey: @ "myArray"] removeAllObjects]; y funciona bien. Mucho más limpio. Has escrito mutableArrayValueForKey mal por cierto, corrige eso y lo marcaré como la respuesta aceptada. :-) – Slacker

+3

Su método funciona perfectamente cuando ArrayController está limitado a una matriz. Pero no funciona cuando ArrayController no está vinculado a una matriz. La matriz 'content' que está obteniendo de ArrayController es' NSArray' no 'NSMutableArray'. Solo use el método de ArrayController para borrar el contenido: 'NSRange range = NSMakeRange (0, [[anArrayController arrangedObjects] count]); [anArrayController removeObjectsAtArrangedObjectIndexes: [NSIndexSet indexSetWithIndexesInRange: range]];' – Quincy

+2

@Quincy The '' 'NSRange'' 'solución es significativamente más rápido que la respuesta original o' '' [anArrayController removeObjects: [anArrayController arrangedObjects]] '' '. ¡Gracias! – bdunagan

3

tenido este problema, así y lo resolvió de esta manera:

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

Desafortunadamente, esto no funciona. Si se llamara a [personas arregladasObjetos], los contenidos de la matriz aún podrían estar allí. Después de eliminar todos los elementos de la matriz de contenido con removeAllObjects, he encontrado que también debe llamar a [personas reorganizar objetos]. – ericg

+0

mi programa se cuelga con esto ... – TCB13

0

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); 
} 
1

Swift

@IBOutlet var acLogs: NSArrayController! 

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

trabajó para mí.

Cuestiones relacionadas