Desechar Popover usando Desvincular Segue en Xcode Storyboard

Estoy usando Xcode 4.5 y la nueva function iOS 6 para desenrollar segues. Estoy presentando un controller de vista de navigation dentro de un popover que se presenta programáticamente desde un elemento de button de barra:

- (IBAction)configChartTapped:(id)sender { if (self.popover.isPopoverVisible) { [self.popover dismissPopoverAnimated:YES]; } else { UINavigationController *chartConfigNavigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"GrowthChartNavigationController"]; ConfigChartTypeViewController *configChartTypeViewController = (ConfigChartTypeViewController*) chartConfigNavigationController.topViewController; self.popover = [[UIPopoverController alloc]initWithContentViewController:chartConfigNavigationController]; self.popover.popoverContentSize = CGSizeMake(320, 500); self.popover.delegate = self; [self.popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } } 

Junto a este método, he definido un objective para desenrollar el segue (es decir, ignorar el popover) …

 - (IBAction)cancelConfig:(UIStoryboardSegue *)segue { // } 

… y lo conectó a un button de cancelación en la barra de navigation de los controlleres de la vista de navigation.

La connection del button de cancelar la barra al button cancelarConfig funcionó bien en Xcode.

Sin embargo, cuando se ejecuta el código, no ocurre nada onclick en el button Cancelar a pesar de que Xcode 4.5 debería ser compatible con la eliminación de los popovers cuando se realicen segues (de acuerdo con los documentos de publicación).

¿Qué me perdí?

¡Gracias!

Los segues de desenvolvimiento usan la búsqueda en time de ejecución primero pidiendo al controller de vista principal que camine por los controlleres de cadena de vista presentados a través de segue hasta que encuentre el método de desenrollamiento correcto. Pero no hay ninguna cadena aquí, ya que el popover se creó mediante progtwigción en lugar de con un popover segue.

No se realizan devoluciones de llamada, ya que no hay un enlace segue al controller de vista principal. Los segues de desenrollamiento son una forma abstracta de delegación, por lo que esto sería similar a olvidar establecer el delegado y no recibir ninguna callback.

La solución es crear el popover con un segue en Interface Builder en lugar de crearlo mediante progtwigción con el método configChartTapped:

Pasos:

En primer lugar, controle y arrastre desde el elemento del button de barra en el controller de vista presentado al controller de vista presentado y select el segund de pop-up:

introduzca la descripción de la imagen aquí

En el controller de vista de presentación , prepareForSegue: para get una reference al controller de popover:

 - (void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender { self.popover = segue.popoverController; } 

Luego implementa shouldPerformSegueWithIdentifier: para restaurar el comportamiento mostrar / ocultar similar a configChartTapped: ::

 - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { if (self.popover.isPopoverVisible) { [self.popover dismissPopoverAnimated:YES]; return NO; } else { return YES; } } 

Finalmente, en Interface Builder, configure el tamaño de contenido de pop-up correcto para el controller de vista presentado :

introduzca la descripción de la imagen aquí

Esto le permitirá desconectarse para cancelConfig: al tocar el button cancelar del popover, y también mostrar / ocultar el popover al tocar el button que lo presenta.