2011-02-08 13 views
6

Después de un trabajo, tengo una vista de popover que muestra una uiview personalizada dentro de la que aparece correctamente. Cuando toca fuera de la vista de popover descarta como se esperaba, sin embargo, también me gustaría descartarla cuando se toca un botón dentro de ella, ¿hay alguien que pueda ayudarme con eso? Luchando por encontrar una guía concisa.Cómo configurar las vistas de Popover para que se eliminen correctamente

Respuesta

12

Para descartar el popover manualmente, deberá mantener una referencia al mismo. Un buen lugar sería en el controlador de vista que muestra el popover.

Para que el botón dentro del controlador de vista de contenido indique al controlador de vista original (que presentó el popover) que descarte el popover, dos de las formas posibles son delegar + protocolo o NSNotificationCenter.

El código de ejemplo siguiente utiliza NSNotificationCenter.

En el .h del controlador de vista que presenta el popover ("PresenterViewController"), añadir una propiedad para el popoverViewController:

@interface PresenterViewController : UIViewController { 
    ... 
    UIPopoverController *popoverController; 
}  
... 
@property (nonatomic, retain) UIPopoverController *popoverController; 
@end 

En el .m de PresenterViewController:

@synthesize popoverController; 
... 
- (void)showPopover 
{ 
    if (self.popoverController == nil) 
    { 
     ContentFooViewController *content = 
      [[ContentFooViewController alloc] init]; 
     UIPopoverController *popover = [[UIPopoverController alloc] 
      initWithContentViewController:content]; 
     [content release]; 
     self.popoverController = popover; 
     [popover release]; 

     // Listen for the "done" notification which will be posted 
     // by the button in the content view controller. 
     // When the notification is received, 
     // call the contentFooViewControllerDone: method... 
     [[NSNotificationCenter defaultCenter] 
      addObserver:self 
      selector:@selector(contentFooViewControllerDone:) 
      name:@"contentFooViewControllerDone" 
      object:popoverController.contentViewController]; 
    } 

    [self.popoverController presentPopoverFromRect:... 
     // OR 
    [self.popoverController presentPopoverFromBarButtonItem:... 
} 

- (void)contentFooViewControllerDone:(NSNotification *)notification 
{ 
    // Button in content view controller was tapped, dismiss popover... 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 

- (void)dealloc 
{ 
    //stop listening for notifications and release popoverController... 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [popoverController release]; 
    [super dealloc]; 
} 

En el controlador de vista de contenido, implemente el método de toque del botón de la siguiente manera:

- (IBAction)dismissButtonTapped 
{ 
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"contentFooViewControllerDone" object:self]; 
} 
+2

Uno Es importante tener en cuenta que si cierra el popover tocando fuera de él, nunca se cerrará correctamente, ya que todavía tiene una referencia al mismo. Esto está bien si no te importa tener un controlador de vista adicional, pero normalmente la memoria es muy alta y no quieres hacer esto. Entonces, también debería usar '- (void) popoverControllerDidDismissPopover: (UIPopoverController *) popoverController' para establecer la propiedad en nil. – memmons

+0

@Hark: Buen punto, gracias. – Anna

+0

Esto es genial, para otros también hay que tener en cuenta que Apple no recomienda tener un botón simplemente para cerrar un popover. Es probable que tu aplicación haga algo más con ese botón también, lo cual está bien. :) – ekinnear

Cuestiones relacionadas