2011-01-10 13 views
7

estoy usando un UISplitViewController dentro de un UITabBarController con una llanura UIViewController en el panel principal de la vista dividida y una UINavigationController en el panel de detalles, que a su vez contiene una vainilla UIViewController.métodos de delegado UISplitViewController no llaman

Soy consciente de que Apple recomienda usar vistas divididas solo en el nivel raíz, sin embargo, he visto otras aplicaciones (por ejemplo, la pestaña Amazon 'Wish List') que usan vistas divididas en pestañas, así que estoy seguro de que es posible .

Mi problema es que los métodos delegados de la vista dividida, es decir. aquellos en UISplitViewControllerDelegate no reciben llamadas, lo que me impide crear mi menú emergente al cambiar al modo de retrato.

Los métodos en cuestión son los siguientes -

// Called when a button should be added to a toolbar for a hidden view controller 
- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc; 

// Called when the view is shown again in the split view, invalidating the button and popover controller 
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem; 

// Called when the view controller is shown in a popover so the delegate can take action like hiding other popovers. 
- (void)splitViewController: (UISplitViewController*)svc popoverController: (UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController; 

El UISplitViewControllerhace recibir las notificaciones de rotación.

puedo conseguir el método willShowViewController que se llamará si fuerzo la orientación barra de estado a la derecha del paisaje (o izquierda) al comienzo de la puesta en marcha de aplicaciones, utilizando

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 

Sin embargo, los willHideViewController doesn ser llamado. Y no quiero obligar a la aplicación a comenzar en el paisaje. Si hago lo mismo pero lo fuerzo a retratar, no recibo las devoluciones de llamada.

No entiendo por qué el controlador de vista dividida no está llamando a sus métodos de delegado cuando se está comportando correctamente. Estos métodos deben ser llamados desde su método-

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

internamente, y cuando este punto de interrupción en el interior, puedo comprobar que el delegado está establecido y que aún está vivo.

¡Estuve atascado en esto todo el día! Todo lo demás funciona muy bien y estoy muy contento de que la combinación splitview/tabbar/navbar funcione bien. Solo necesito estas notificaciones.

¿Debería simplemente llamarlos manualmente cuando gire? Parece muy incorrecto cuando el `UISplitViewController 'debería estar haciendo esto.

Respuesta

4

Resuelto, tiene que ser a nivel raíz o una subvista directa de un tabBar que también debe estar en el nivel raíz. ¡Molesto!

+0

Hola, ¿te importaría elaborar tu solución un poco más? Tengo el mismo problema en este momento. Obtuve 1 tabcontroller que tiene una vista dividida en 3 pestañas. Agregué la vista de detalle en cada vista dividida a un controlador de navegación con subclases propio que delega la vista dividida. Esto funciona de manera impecable para la pestaña actualmente visible pero no para las demás. Así que cuando gire mi vista y cambie la pestaña, se ve mal, hasta que la gire. Nuevamente, solo para la vista visible. –

+0

hmm lo siento, no estoy seguro ... estoy seguro de que he visto una publicación aquí en algún lugar que indicaba que cambiar entre pestañas de vista dividida y rotar causaba problemas, y que el splitviwe siempre debería estar al nivel de la ventana, ni siquiera bajo una controlador de pestañas Que está respaldado por los documentos, supongo. De hecho, estoy tomando la ruta de construir mi propio SplitView desde cero ya que necesito divisiones horizontales – Sam

+1

En lugar de intentar desde cero, intente esto - http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad – Viraj

3

Primero, intente ver si está configurando los delegados correctos. por ejemplo, digamos que usted ha creado tres controladores,

UISplitViewController* splitView; 
UIViewController* masterView; 
UIViewController* detailView; 

Ha implementado el protocolo de delegado en la vista de detalle, de modo que cuando los cambios de orientación, vista de detalle debería ser capaz de poner un botón en la barra de herramientas.

Ahora, para que splitView llame a esta función desde el delegado, debe configurar el delegado.

Así que en alguna parte, si le falta la siguiente llamada,

splitView.delegate = detailView; 

DetailView de nunca reciba una notificación del cambio de orientación, etc. Por lo menos aquí es donde me he quedado atrapado.

La otra opción es mirar el siguiente enlace. También tiene un código completamente funcional, aunque después de revisarlo un poco, podría ser un poco más de lo que necesita para que las cosas funcionen, pero entonces ... es un código que ya está funcionando, por lo que debería hacerlo funcionar rápidamente. .

http://www.noorselijster19.com/2011/03/ios/combine-tabbar-and-splitview/

2

me gusta el siguiente método de envío de un mensaje de la UIViewController maestro al detalle UIViewController. En algún lugar dentro de la implementación del maestro:

id detailViewController = [[self.splitViewController viewControllers] lastObject]; 
[detailViewController setSomeProperty:…]; 

Esto es de caída de Paul Hegarty 2011 Stanford iTunesU IPAD y el desarrollo de aplicaciones iPhone supuesto.

+0

Me gusta mucho tu idea porque es un pensamiento fuera de la caja . –

Cuestiones relacionadas