2012-05-10 12 views
7

Estoy tratando de armar una aplicación para iPad usando UISplitViewController y guiones gráficos. La vista maestra comienza con un controlador de navegación vinculado a una vista de tabla de 6 opciones de menú. Cada celda de la tabla empuja un controlador de vista de tabla diferente a la pila de navegación. Esto funciona bien para la vista maestra. Cada vista maestra tiene una lista de tabla que, al hacer clic, debe mostrar un controlador de vista diferente en el panel de detalles. Actualmente lo he hecho con un segue establecido en 'Reemplazar' y 'Detalle dividido' que funciona la primera vez que se hace clic en una fila, pero tan pronto como haga clic en otra fila en la vista maestra o gire el dispositivo, la aplicación se bloquea. con EXC_BAD_ACCESS.iOS - UISplitViewController con storyboard - múltiples vistas maestras y múltiples vistas de detalles

Estoy bastante seguro de que mis problemas tienen que ver con la configuración del delegado para UISplitViewController. Estoy confundido sobre cómo se debe usar esto cuando tengo múltiples VCs maestros y múltiples VCs detallados. ¿Dónde debería ubicarse el código de delegado: maestro o detalle? ¿Debo implementar los eventos de protocolo UISplitViewControllerDelegate en cada controlador de vista?

Cualquier ayuda apreciada.

Respuesta

16

Si el delegado del controlador de vista dividida era el controlador de visualización de detalles que se había reemplazado, esta es la causa del bloqueo. El controlador de vista detallada reemplazado está siendo desasignado y, por lo tanto, el delegado del controlador de vista dividida ya no es una referencia a un objeto válido.

Puede actualizar el delegado en prepareForSegue: remitente :. Por ejemplo:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"MySegue"]) { 
     UIViewController *destinationViewController = [segue destinationViewController]; 
     if ([destinationViewController conformsToProtocol:@protocol(UISplitViewControllerDelegate)]) { 
      self.splitViewController.delegate = destinationViewController; 
     } 
     else { 
      self.splitViewController.delegate = nil; 
     } 
    } 
} 

Qué controladores de vista usa para delegados depende de su jerarquía de controlador de vista. En el caso más simple, cualquier controlador de vista que esté asignado al detalle de splitVC probablemente necesite ser delegado. Es posible que desee basarlos en una superclase común que maneja la lógica de delegado del controlador de vista dividida compartida.

+0

Muchas gracias Chris, buena explicación. –

+0

Me ha salvado el día. –

+0

¡Eso realmente me ayudó! – Fogh

Cuestiones relacionadas