Pregunta

en mi aplicación hice un enlace muy simple. Tengo un NSMutableArray vinculado a un NSArrayController. El controlador en sí está vinculado a un ComboBox y muestra todo el contenido de NSMutableArray. Funciona bien.

El problema es: el contenido de la matriz cambiará. Si el usuario realiza algunos ajustes en la aplicación, elimino todos los elementos de NSMuteableArray y los relleno con elementos nuevos y diferentes.

Pero la unión de NSMutableArray < - > NSArrayController & Lt; - & Gt; NSComboBox no se actualiza.

No importa si elimino todos los objetos de la matriz, ComboBox sigue mostrando los mismos elementos.

¿Qué está mal aquí? ¿Mi enfoque es incorrecto o solo necesito decirle al enlace que se actualice? No descubrí cómo hacer eso.

¿Fue útil?

Solución

Es probable que " edite la matriz detrás del controlador " ;, lo que subvierte el mecanismo KVO.

Dijiste:

  

Tengo un NSMutableArray vinculado a un NSArrayController.

¿Cómo? ¿Dónde vive la matriz? En un documento, accesible a través de un KVC / KVO compatible -myArray / -setMyArray: ¿conjunto de accesos?

Apuesto a que estás diciendo directamente el " myArray " ivar para -removeAllObjects, ¿verdad? ¿Cómo serán estos accesores KVC / KVO & Quot; know & Quot; la matriz ha cambiado?

La respuesta es que no. Si realmente está reemplazando toda la matriz, querrá decirle a su documento (o al propietario de la matriz) -setMyArray: a una matriz completamente nueva. Esto activará las llamadas KVO adecuadas.

... pero entonces, realmente no necesitas una matriz mutable, ¿verdad? Si solo desea reemplazar elementos individuales en la matriz, querrá usar accesores indexados:

(Documentación: consulte la sección Patrones de acceso de colección para propiedades de muchas) http://tinyurl.com/yb2zkr5

Otros consejos

Pruebe esto (usando ARC / OS X 10.7):

en el archivo de encabezado, defina el arrayInstance y el arrayController

 @property (weak) IBOutlet NSArrayController *arrayController;
 @property (strong) NSArray *arrayInstance; // for the array instance

luego en implementación

 @synthesize arrayController = _arrayController;
 @synthesize arrayInstance = _arrayInstance;

 _arrayInstance = .......  // What ever the new array will be
 [_arrayController setContent:_arrayInstance];

Esto obligará al arrayController a actualizar el contenido y mostrarlo correctamente.

Otra solución de código de 2 líneas sería:

 [self willChangeValueForKey:@"arrayInstance"];
 _arrayInstance = .......  // What ever the new array will be
 [self didChangeValueForKey:@"arrayInstance"];

Creo que el primero parece más obvio, el segundo más parecido a KVO.

El cumplimiento de KVC / KVO parece ser el problema. Debe crear la nueva matriz y actualizar la referencia con el nuevo objeto utilizando los métodos de acceso generados. De lo contrario, puede enviar mensajes KVO sobre la matriz que se está actualizando para informar a los enlaces que el contenido de la matriz ha cambiado.

Cristiano

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top