2012-04-25 8 views
6

Yo quería jugar con UIPopupController, y entendí que no puedo detectar cuando mi popover se descarta. Mis pasos: 1. Crear
ejemplo de XCode (Archivo -> Nuevo proyecto -> Aplicación Utilitiy)
2. Agregar a MainViewController.h UIPopoverControllerDelegateDetección de despido de popo

#import "FlipsideViewController.h" 

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate,UIPopoverControllerDelegate> 

@property (strong, nonatomic) UIPopoverController *flipsidePopoverController; 

- (IBAction)showInfo:(id)sender; 

@end 
  1. En MainViewController:
 

    - (IBAction)showInfo:(id)sender 
    { 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
      FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
      controller.delegate = self; 
      controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
      [self presentModalViewController:controller animated:YES]; 
     } else { 
      if (!self.flipsidePopoverController) { 
       FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
       controller.delegate = self; 

       self.flipsidePopoverController.delegate = self 

       self.flipsidePopoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
      } 
      if ([self.flipsidePopoverController isPopoverVisible]) { 
       [self.flipsidePopoverController dismissPopoverAnimated:YES]; 
      } else { 
       [self.flipsidePopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
      } 
     } 
    } 

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 
    { 
     NSLog(@"OLOLO"); 
    } 

Pero cuando toco en algún lugar, y desaparecen popover, no hay ningún mensaje NSLog en la consola. ¿Qué estoy haciendo mal?

+4

va a configurar el delegado * * ANTES ** crea una instancia del controlador popover. En otras palabras, no existe cuando configuras el delegado –

+0

Verdad, verdad. ¡Muchas gracias! –

Respuesta

2

¿Ha establecido su instancia de MainViewController como el delegado del popover?

(si crea el popover a través de código) popover.delegate = self;

+0

FlipsideViewController * controller = [[FlipsideViewController alloc] initWithNibName: @ "FlipsideViewController" paquete: nil]; controller.delegate = self; –

+0

ya estaba allí. –

+0

¿Es así como estás creando el popover?Publicar más código –

15

establezca los delegados de la popover a sí mismo y también se pueden utilizar dos delegados popover es decir: -

/* Called on the delegate when the popover controller will dismiss the popover. Return NO to prevent the dismissal of the view. 
*/ 
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController; 

/* Called on the delegate when the user has taken action to dismiss the popover. This is not called when -dismissPopoverAnimated: is called directly. 
*/ 
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController; 
+1

Tenga en cuenta que la función didDismiss solo se invoca cuando el popover se descarta, como un toque fuera de él. Si lo descarta usted mismo con su propio código (desde un botón presione, por ejemplo), no se ejecutará. – CMash

4

A principios de respuestas han sugerido el uso de UIPopoverControllerDelegate, que parece ser la única forma sensata de lograr el objetivo. Pensé que sería bueno agregar un ejemplo práctico, ya que no es lo más simple para darse una vuelta. Mi requisito era simple - Yo quería que el fondo de la vista sea borrosa mientras que el popover es visible, así que aquí están los pasos:

  1. Wire su popover en un guión gráfico, configurar su tamaño contenido popover en el controlador de vista de destino atributos.

  2. que el controlador de vista del origen de un UIPopoverControllerDelegate abriendo el archivo .h y hacer algo como esto:

    @interface MyController : UIViewController <UIPopoverControllerDelegate> 
    
  3. Anulación prepareForSegue, asignar el controlador de vista de origen como el delegado para el popover y luego configurar alfa a 0,5 antes de la segue presenta el destino:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
        UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue; 
        popover.popoverController.delegate = self; 
        self.view.alpha = 0.5; 
    } 
    
  4. implementar el método popover delegado popoverControllerDidDismissPopover. Establecer alfa de nuevo a 1.0 y cancelar la asignación de nosotros mismos como el delegado para asegurarse de que no nos detenemos ARC haciendo su trabajo:

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
        self.view.alpha = 1.0; 
        popoverController.delegate = nil; 
    } 
    
+1

Tenga en cuenta que la función didDismiss solo se invoca cuando el popover se descarta, como un toque fuera de él. Si lo descarta usted mismo con su propio código (desde un botón presione, por ejemplo), no se ejecutará. – CMash

0
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
UIStoryboardPopoverSegue *popoverSegue; 
popoverSegue = (UIStoryboardPopoverSegue *)segue; 
popoverController = popoverSegue.popoverController; 
pCVisible = YES; 
[[segue destinationViewController] setDelegate:self]; 
} 

- (void) setDataFromPopover { 
    if (pCVisible) { 
    [popoverController dismissPopoverAnimated:YES]; // THIS IS KEY! this is where the popover is dismissed, not in the popover itself 
    } 
} 

Y

//TableViewController.m 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:  (NSIndexPath *)indexPath 
{ 
    //variable = whatever 

OtherViewController *initialView; 
initialView=(OtherViewController *)self.delegate; 
initialView.theLabel.text = variable; 
[initialView setDataFromPopover]; 
}