Pregunta

Tengo algunos problemas para mostrar el contenido de un NSArrayController en dos ventanas definidas en diferentes XIB.

En mi ventana principal (en MainMenu.xib), tengo un NSTableView que está vinculado a un NSArrayController

En mi segundo XIB, tengo otra ventana que contiene un NSTableView. Creé un nuevo NSArrayController, y vinculé la tabla al contenido de ese NSArrayController.

Ambos NSArrayControllers están vinculados exactamente a la misma NSArray.

Todo está bien al principio, pero el problema es que si se agrega un objeto a la matriz usando el NSArrayController en la ventana principal, la vista de la ventana secundaria de los datos no se actualiza. Esto es muy probable porque no sabe que necesita actualizarse, ya que su NSArrayController no se usó para agregar el nuevo objeto.

Lo que me gustaría hacer es usar exactamente la misma instancia de NSArrayController en ambas ventanas. De esta forma, si se agrega un objeto a la matriz, se notificará el cambio a ambas vistas.

El problema es que no puedo entender cómo hacer esto en Interface Builder. No puedo vincular un NSArrayController a otro NSArrayController (aparece un error de tiempo de ejecución que indica que solo se puede vincular a un NSArray). Conectar el NSArrayController al miembro NSArrayController del Propietario del archivo tampoco ayudará, ya que eso simplemente eliminará el NSArrayController que quiero que use.

Supongo que podría configurar los enlaces yo mismo en el código, pero parece que sería mejor usar Interface Builder si es posible. ¿Hay alguna manera de hacer esto en Interface Builder, o tal vez una mejor manera de configurarlo todo junto?

Actualización: en respuesta a la respuesta y comentarios de Chuck, probé lo siguiente: -Enlace el contenido de la tabla de mi NSTableView a los objetos organizados del miembro NSArrayController (si usé el NSArrayController en sí, apareció un error en el registro: " [NSArrayController count]: selector no reconocido enviado a la instancia ") -Enlace cada columna de la tabla al propietario del archivo, con una ruta clave de modelo de arrayController.arrangedObjects.propertyName

Esto aún no dio como resultado que el contenido de la tabla recibiera actualizaciones. Creo que esto se debe a que estoy vinculado a los objetos arreglados de NSArrayController, en lugar de a NSArrayController en sí. Pero, si me uno directamente al NSArrayController, eso me da errores.

Normalmente, seleccionaría mi NSArrayController de " Bind to & " ComboBox, utilice arregladoObjetos como la clave del controlador y la propiedad en sí misma como la ruta de la clave del modelo. No estoy seguro de cómo hacer el equivalente de eso en este caso, si es que puedo.

¿Hice algo mal en el proceso anterior?

¿Fue útil?

Solución

La mejor opción que he podido encontrar es notificar al segundo NSArrayController que la matriz que está administrando ha cambiado llamando a rearrangeObjects: . Parece torpe, pero funciona.

Otros consejos

¿Qué hay de configurarlos como objetos proxy en IB y luego instanciar el código real, tal vez en el delegado de su aplicación?

Puede hacer que ambos NSArrayControllers se actualicen a través de KVO cuando se agrega la matriz. El truco es que debe observar y agregar a la matriz de forma compatible con KVO.

Desearía algún objeto que posea la matriz, llamémosle "modelo". La matriz tiene que ser una clave en el objeto, llamemos a la clave " contentArray " ;. A continuación, cuando agregue / elimine, debe hacerlo llamando primero a mutableArrayForKey en " model " para obtener " contentArray " ;. Entonces la adición / eliminación de la matriz debería funcionar, por ejemplo:

El controlador1 está vinculado a self.model.contentArray

Controller2 está vinculado a self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

Alternativamente, puede hacer las notificaciones de KVO manualmente de esta manera:

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}

No hay razón para que dos controladores de matriz hagan que una vista no se actualice cuando se actualiza a través de otra. Si no está sucediendo, parece que sus notificaciones de KVO se están perdiendo en alguna parte. Lo más probable es que esté editando directamente una matriz (en el método add: de la subclase NSArrayController, ¿quizás?) Sin enviar las notificaciones de cambio adecuadas.

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