Pregunta

En primer lugar, ¿podemos hablar de iOS 5 aquí? ¿O todavía está bajo NDA? Si no podemos hablar de eso, solo ignora mi pregunta.

Al probar mi aplicación con un iPad con iOS 5 instalado, descubrí un problema con mi Popover "modal": esto se puede cerrar tocando fuera de él, en otras palabras, ¡no es modal! No tengo idea de lo que estoy haciendo mal.

Un controlador de vista abre el Popover con este código:

AddProjectViewController *addProjectViewController = [[AddProjectViewController alloc] initWithStyle:UITableViewStyleGrouped];
[addProjectViewController setDelegate:self];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addProjectViewController];
[addProjectViewController release];

CGRect popoverFrame = [sender frame];

UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:navController];
[tempPopover presentPopoverFromRect:popoverFrame inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.currentPopover = tempPopover;
[tempPopover release];
[navController release];

El controlador View que está dentro del Popover tiene esta línea en su ViewDidload.

- (void)viewDidLoad
{
    [self setModalInPopover:YES];

    // Do other stuff
}

¿Falta algo?

¿Fue útil?

Solución

Lo encontré. La asignación de SetModalInPoPover debe estar dentro del método ViewDidAppear del controlador de vista incrustado para que el Popover sea modal:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self setModalInPopover:YES];
}

Otros consejos

La respuesta aprobada funcionará si está utilizando un controlador de vista personalizado que sepa que la vista va a estar en un popover. Sin embargo, si está utilizando un controlador de vista genérico creado programáticamente o un controlador de vista cuyo viewDidAppear método que no tiene la capacidad de anular por cualquier razón, también puede implementar el UIPopoverControllerDelegate Protocolo en una clase, configure el delegado de Popover en esa clase y devuelva no, en el popoverControllerShouldDismissPopover.

Ejemplo

En alguna clase que implementa UIPOPOVERCONTROLLERDELEGATE:

- (BOOL) popoverControllerShouldDismissPopover:(UIPopoverController *) popoverController {
    return NO;
}

En el código que crea su controlador Popover:

UIPopoverController * pc = initialize and setup 

pc.delegate = instance of class that impleements UIPopoverControllerDelegate

¿Has intentado establecer el modalInPopover ¿Propiedad del controlador de navegación? Este es el controlador de vista que en realidad es "propiedad" del popover, por lo que esperaría que el popover use su modalInPopover propiedad para determinar si es modal o no.

Quizás UINavigationController Pasé esto a su controlador de vista infantil actualmente visible en iOS 4.x.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top