2011-03-29 8 views
8

sé la documentación del SDK dice¿Hay alguna forma de que no se elimine el popover cuando se presiona fuera de él?

Taps fuera del contenido del popover descartar automáticamente el popover.

Pero estoy seguro de que la gente inteligente aquí encontró una forma :) tal vez debería sobrescribir la función de descarte de popover?

Gracias

EDIT: He intentado utilizar las passthroughViews como se sugiere aquí, y funciona perfectamente. Aquí está el código para quien lo necesite: en este ejemplo, puse self.view en la matriz, lo que significa que donde sea que esté fuera del botón donde se originó el popover, nada descarta el popover.

 popoverController.passthroughViews = [[[NSArray alloc] initWithObjects:self.view, nil] autorelease]; 

Respuesta

11

Debes establecer la propiedad passthroughViews. De la documentación:

Una serie de vistas con las que el usuario puede interactuar mientras el popover está visible.

@property (nonatomic, copy) NSArray *passthroughViews

Cuando un popover está activo, las interacciones con otros puntos de vista están deshabilitadas normalmente hasta que se desestimó la popover. La asignación de una matriz de vistas a esta propiedad permite que las vistas correspondientes manejen los grifos fuera del popover.

Establezca passthroughViews en una matriz de vistas que desea manejar el evento táctil en lugar de simplemente descartar el popover.

+0

Gracias! Voy a intentarlo de inmediato. Estoy avergonzado de que no pude encontrarlo en el código, pero es por eso que tenemos el stackoverflow, ¿verdad?:) ¿Tiene un ejemplo/referencia al ejemplo de cómo configurar estas vistas? –

6

La respuesta aceptada realmente no responde a la pregunta, "¿hay alguna forma de que no se elimine el popover al presionar fuera de él?", Imo. Da una vista posible, pero podría requerir acceso no autorizado a todas las vistas principales y determinar qué vistas hay en la pantalla, etc. La pregunta podría reformularse como "¿cómo hago una vista modal popover?"

podría hacer esto como tal, con un botón para cerrar el hecho popover:

UIViewController* vc = [[[UIViewController alloc] init] autorelease]; 

UIBarButtonItem* doneButton = [[[UIBarButtonItem alloc] initWithTitle:@"Done"] style:UIBarButtonItemStyleDone target:self action:@selector(processDoneAction)] autorelease]; 

[vc.navigationItem setLeftBarButtonItem:doneButton]; 

vc.modalInPopover = YES; 
//If you want full screen: 
vc.modalPresentationStyle = UIModalPresentationFullScreen; 
vc.wantsFullScreenLayout = YES; 

UINavigationController* navC = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease]; 

UIView* view = create your view 

vc.view = view; 

UIPopoverController* pc = [[[UIPopoverController alloc] initWithContentViewController:navC] autorelease]; 
pc.delegate = self; 
self.popoverController = pc; 

entonces te en su método processDoneAction Usted tendrá que descartar el popover. Otras consideraciones serían descartar y volver a mostrar los cambios de orientación del dispositivo, pero lo dejaré para otro ejercicio, ya que se ha respondido previamente en stackoverflow.

7

Hay una solución muy simple y legítima. En el controlador de vista que presenta su UIPopoverController, cumpla con el protocolo UIPopoverControllerDelegate e implemente el siguiente método delegado. Acabo de probar esto y evita que Popover descarte.

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

Sólo asegúrese de que ha configurado el delegado de su controlador popover a la vista controlador que implementa esto.

Puede descartar el popover utilizando el método [popoverController dismissPopoverAnimated:NO];.

Cuestiones relacionadas