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 :
- A veces no pongo ningún elemento en la lista, porque no hay ninguno. Entonces solo ves los elementos viejos.
- Esto es un poco asqueroso de todos modos.
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
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
@Quincy The '' 'NSRange'' 'solución es significativamente más rápido que la respuesta original o' '' [anArrayController removeObjects: [anArrayController arrangedObjects]] '' '. ¡Gracias! – bdunagan