Pregunta

El uso de una vista dividida en el IPAD, tengo el siguiente código:

- (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc {
  barButtonItem.title = @"Categories";
  NSMutableArray *items = [[toolbar items] mutableCopy];
  [items insertObject:barButtonItem atIndex:0];
  [toolbar setItems:items animated:YES];
  [items release];
  self.popoverController = pc;
}

Esto funciona bien para mostrar el popover cuando se pulsa el botón. Sin embargo, también me gustaría tener la popover descartar si se pulsa el botón mientras que ya está abierto a seguir las normas de buena. ¿Cómo voy a ir haciendo esto? (Es decir, si el usuario hace clic en este botón repetidamente, el popover debe venir y ocultar cualquier otro golpe.)

¿Fue útil?

Solución

Cuando se llamará popover pantalla splitViewController, por debajo de método. Sólo echa por no decir nulas, entonces descartarlo:)

- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController{
  if ([pc isPopoverVisible]) {
     [pc dismissPopoverAnimated:YES];
  }
}

Otros consejos

HIG de Apple dice que no debería haber un botón Descartar explícita dentro de un popover, pero para hacer lo que preguntas, usted tiene dos opciones.

1) publicar un NSNotification

o

2) profundizar en la jerarquía de la vista hasta que tenga la instancia popover

1) en el que sea vista en la que está presentando el popover en, en el método viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissThePopover) name:@"popoverShouldDismiss" object:nil];

crear un método llamado "dismissThePopover" y en el método dealloc, removeObserver

-(void)dismissThePopover {
    [self.popoverController dismissPopoverAnimated:YES];
}

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

En su popoverController "despedir" botón, introduzca la siguiente línea:

[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];

Hacer que envía una notificación a la aplicación, y puesto que usted ha registrado su otro controlador fin de escuchar por ello, cada vez que ve que la notificación se llama el selector se especifica, en este caso, dismissThePopover.

2) profundizar en la jerarquía de visión para encontrar self.popoverController

comprobar esto, la suya será diferente, sin duda, pero la idea general es la misma. Comenzar a su AppDelegate, movimiento en el primer viewcontroller, movimiento en subvistas hasta que llegue a su objeto self.popoverController.

MyAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
//appDelegate instance, in this case it's the .m file for your ApplicationDelegate

UISplitViewController *svc = appDelegate.splitViewController;
//In this case the first view inside the appDelegate is a SplitView, svc

UINavigationController *navc = [[svc viewControllers]objectAtIndex:0];
//a navigationController is at index:0 in the SplitView hierarchy. DetailView is at index:1

NSArray *vcs = [navc viewControllers];
//vcs is the array of different viewcontrollers inside the Navigation stack for nvc

iPadRootViewController *rootView = [vcs objectAtIndex:0];
//declare the rootView, which is the .m file that is at index:0 of the view array

UIPopoverController *pc = [rootView popoverController];
//HERE WE GO!!! popoverController is a property of iPadRootViewController's instance rootView, hereby referred to as pc.

[pc dismissPopoverAnimated:YES];
//bye bye, popoverController!

Espero que esto ayude

Esto es mucho más fácil porque el popoverController es una propiedad. Hace que sea más fácil de referencia.

if ([self.popoverController isPopoverVisible]) {
    //using the setters and getters "goes thru the proper channels" when accessing objects
    [self.popoverController dismissPopoverAnimated:YES];
} else {
    UIPopoverController *pc = [[UIPopoverController alloc] initWithContentViewController:YOUR_VIEW_CONTROLLER];
    self.popoverController = pc;
    [pc release];

    //get the button instance you set on the toolbar
    UIBarButtonItem *categoryButton = [[toolbar items] objectAtIndex:0];
    [self.popoverController presentPopoverFromBarButtonItem:categoryButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

De hecho, me he dado cuenta de que se está refiriendo al código dentro del método Delegado para la visualización de la viewController en el índice: 0 de su SPLITVIEW. Esta respuesta no se aplica necesariamente a eso, sino que se aplica a cualquier otro momento que está accediendo y creando popoverControllers en el IPAD. Sin comprobar si un popover es visible en primer lugar, que o bien bloquearse o abiertos varios panecillos.

Gracias por su tiempo.

Se podría intentar el siguiente

if(![popoverController isPopoverVisible]){
   // Show popover
}
else{
   // close popover
   [popoverController dismissPopoverAnimated:YES];
}

Si está utilizando la configuración por defecto UISplitViewController, a continuación, el botón de la barra de navegación que se crea un popover pantallas de su RootViewController.

Si desea asegurarse de que usted no tiene múltiples ventanas emergentes en a la vez, se puede descartar simplemente pop-ups cada vez que aparece su RootViewController. Código de aquí me utilizar para resolver este problema:

- (void) viewWillAppear:(BOOL)animated {
  if ([self.popover isPopOverVisible]) {
    [self.popover dismissPopoverAnimated:YES];
  }
  [super viewWillAppear:YES];
}

El código que utiliza para mostrar el popover en RootViewController.m:

- (IBAction) addCategory:(id)sender {
  AddCategoryViewController *content = [[AddCategoryViewController alloc] init];
  UIPopoverController *aPopover = [[UIPopoverController alloc]
                                   initWithContentViewController:content];

  aPopover.delegate = self;

  // Store the popover in a custom property for later use.
  self.addCategoryPopover = aPopover;
  addCategoryPopover.delegate = self;
  [aPopover release];
  [content release];

  [addCategoryPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

Esto solía tratar de descartarlo de otra clase:

-(IBAction)saveAddCategory:(id)sender {
  rootViewController = [[RootViewController alloc] init];
  [rootViewController dismissPopover];
}

Mi función dismissPopover se ve así:

- (void) dismissPopover {
  if ([self.addCategoryPopover isPopoverVisible]) {
    [self.addCategoryPopover dismissPopoverAnimated:YES];
  }
  if (addCategoryPopover.popoverVisible == YES) {
    [addCategoryPopover dismissPopoverAnimated:YES];
  }
}

Sí, se puede establecer el modalPresentationStyle de la siguiente manera:

controller.modalPresentationStyle = UIModalPresentationFormSheet;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top