Sepa cuándo se descarta el maestro de la vista dividida con un gesto.

Estoy implementando una aplicación de detalles maestros en iOS 7, el controller de vista maestra es un controller de navigation que puede navegar a través de dos controlleres de vista de tabla. El detalle es un controller de vista simple que muestra una image.

He implementado los methods UISplitViewController en detalle:

 - (BOOL) splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { return UIInterfaceOrientationIsPortrait(orientation); } - (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc { UINavigationController* nav= (UINavigationController*)aViewController; barButtonItem.title= nav.topViewController.title; self.navigationItem.leftBarButtonItem= barButtonItem; } - (void) splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { self.navigationItem.leftBarButtonItem= nil; } 

El problema es que splitViewController:willHideViewController:withBarButtonItem:forPopoverController: no se llama cuando el usuario descarta el controller de vista maestra con un gesto.

Esto oculta el problema de que si el usuario navega por el controller de navigation del maestro y luego descarta el maestro, el elemento del button de la barra de tabulación muestra el título anterior.

Para que quede más claro, explicaré qué pasa paso a paso. El título del controller de navigation raíz del controller de navigation del maestro es "Top Places". El título del controller de vista empujada es "Fotos". Cuando se inicia la aplicación, no hay maestro en el modo vertical:

introduzca la descripción de la imagen aquí

El usuario presenta el controller de vista "Top Places":

introduzca la descripción de la imagen aquí

Luego, el usuario navega hacia el segundo controller de vista: "Fotos":

introduzca la descripción de la imagen aquí

Luego, el usuario descarta el maestro, pero el elemento del button de la barra de tabs sigue conservando su antiguo título "Top Places":

introduzca la descripción de la imagen aquí

El problema es que el delegado del controller de vista dividida no tiene un método llamado cuando se descarta el maestro mediante un gesto.

No existe un método de delegado UISplitViewControllerDelegate para detectar cuándo se descarta el popover mientras está en orientación vertical. No importa cómo se descarta. Si desea saber, configure un delegado para el controller popover.

The splitViewController:willHideViewController:withBarButtonItem:forPopoverController: se llama al método de delegado cuando gira de un paisaje a otro.

No necesita saber cuándo se descarta la vista maestra, simplemente configure el título del button de acuerdo con el título del elemento de navigation del topViewController actual del controller de navigation. Puede hacer esto haciendo que su controller de detalles sea el delegado del controller de navigation,

 @interface DetailController () @property (strong,nonatomic) NSString *barButtonTitle; @end @implementation DetailController - (void)viewDidLoad { [super viewDidLoad]; [(UINavigationController *)self.splitViewController.viewControllers[0] setDelegate:self]; self.splitViewController.delegate = self; self.navigationItem.leftBarButtonItem.title = [[(UINavigationController *)self.splitViewController.viewControllers[0] topViewController] navigationItem].title; } - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { self.barButtonTitle = viewController.navigationItem.title; self.navigationItem.leftBarButtonItem.title = self.barButtonTitle; } - (BOOL) splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { return UIInterfaceOrientationIsPortrait(orientation); } - (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc { barButtonItem.title= self.barButtonTitle; self.navigationItem.leftBarButtonItem= barButtonItem; } - (void) splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { self.navigationItem.leftBarButtonItem= nil; }