Pregunta

Tengo un problema para envolver mi cabeza sobre cómo conectar algunos NsArrayControllers en dos controladores de vista. Quiero sincronizar la selección en la vista de la tabla de la lista de origen para actualizar los valores en el segundo controlador de vista de detalle.

Estoy usando el Cocoa Dev Central construir un tutorial de datos básicos Como punto de partida, pero ha descomponido la arquitectura para que haya un NswindowController que contenga dos NSViewControllers: uno para la tabla de publicaciones a la izquierda y otra para los detalles de la publicación a la derecha.

La subclase NSWindowController tiene un NsArrayController que está vinculado a la entidad post y a un accesor de lectura de solo lectura de solo lectura que señala [[NSApp delegate] managedObjectContext]

Luego inicializé los dos controladores de vista en el windowDidLoad método.

- (void)windowDidLoad
{
  static NSInteger kSourceListViewIndex = 0;
  static NSInteger kDetailViewIndex = 1;

  self.postsListsViewController = [[MDVCPostsListViewController alloc] initWithWindowController:self];  
    NSView *sourceListSplitViewContentView = [[self.splitView subviews] objectAtIndex:kSourceListViewIndex];
  NSView *sourceListView = [self.postsListsViewController view];
  [sourceListView setFrame:[sourceListSplitViewContentView bounds]];
  [sourceListView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
  [sourceListSplitViewContentView addSubview:sourceListView]; 

  // And now let's load the detail view.
  self.postDetailViewController = [[MDVCPostDetailViewController alloc] initWithWindowController:self];
    NSView *detailSplitViewContentView = [[self.splitView subviews] objectAtIndex:kDetailViewIndex];
  NSView *detailView = [self.postDetailViewController view];
  [detailView setFrame:[detailSplitViewContentView bounds]];
  [detailView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
  [detailSplitViewContentView addSubview:detailView]; 
}

MDVCPostsListViewController tiene un nsArrayController vinculado a la entidad post y su contexto de objeto administrado vinculado al contexto de objeto administrado del controlador de la ventana principal (todo a través del constructor de interfaz)

MDVCPostDetailViewController tiene un nsobjectController vinculado al contexto del objeto administrado del controlador de ventana y el objeto de contenido unido al controlador de la ventana a través de postsListsViewController.postsArrayController.selection. Esto parece un truco realmente sucky.

¿Cómo puedo conseguirlo para que cambie la selección en MDVCPostsListViewControllerLa vista de la tabla se actualizará los valores seleccionados en MDVCPostDetailViewController? Siento que estoy cerca, pero no estoy seguro de qué falta o cuál es la mejor ruta a tomar. Siento que el postsListsViewController.postsArrayController.selection La encuadernación es extremadamente hacky. Ojalá haya una mejor manera.

He subido mi proyecto de muestra que exhibe esto para aquellos que prefieren mirar el código en lugar de solo leer descripciones. Puedes agarrarlo de mi sitio en http://www.secondgearsoftware.com/attachments/stackoverflow_objectController.zip

¿Fue útil?

Solución

¿Cómo espera que cada controlador de ventana descubra el controlador de ventana principal?

Desde un vistazo rápido al proyecto, parece que acaba de agregar una instancia de MDVCMainWindowController a cada NIB. Estas serán instancias separadas de la que realmente ejecuta la ventana principal.

Debe vincular la selección de la tabla de la lista de origen, Indexes al controlador Post Array. De lo contrario, la selección no se conocerá a nivel del controlador.

Sugeriría mover el controlador de matriz hacia el controlador de la ventana principal. En su método de WindowsDidLoad, puede pasarlo a la lista y la vista de detalle. La lista se uniría a AcortedObjects y SelectionIndexes, la vista de detalle se uniría a la selección.

Otros consejos

El problema es con el enlace del objeto de contenido de la instancia de NSObjectController en la vista de detalle XIB. Su controlador de matriz en la vista de lista XIB está publicando correctamente las notificaciones de KVO (verificada esto haciendo que la instancia MDVCPostDetailViewController observe esto con KVO), por lo que no estoy seguro de por qué, pero por alguna razón el controlador de objetos no está respondiendo a ellos.

Sin embargo, hay un par de enfoques diferentes que puede adoptar que funcionarán. Puede deshacerse del controlador de objetos y vincular los campos de texto, etc., en la vista de detalle XIB directamente al controlador de matriz (el propietario de archivo.WindowController.postSlistsViewController.postsArrayController.selection.wats). Alternativamente, puede mantener el controlador de objeto y hacer que su controlador de vista de detalle observe la propiedad de selección del controlador de matriz y "manualmente" establece la propiedad de objeto de contenido del controlador de objeto cuando cambia la selección.

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