2012-03-26 48 views
26

Si desea borrar un popover - por ejemplo, desde un botón dentro de contentViewController del popover debe -¿Desea descartar un UIPopoverController dentro de su contentViewController?

  1. Crear una referencia a la popover a ser considerado por el controlador de vista que lo crea
  2. Crear una notificación de la contentViewController para permitir que el controlador de vista propietaria sabe que debería ser despedido, o, alternativamente, crear un delegado para el mismo propósito
  3. Enviar el mensaje de notificación o delegado cuando el popover está listo para ser descartado
  4. llamada dismissPopover:animated cuando la notificacion Método ción o el delegado se llama

Mientras tanto, desde un UIViewController se puede acceder al controlador de vista modal, el controlador de vista de los padres, el control de navegación, el controlador de la vista dividida, el controlador de la barra de pestañas, el controlador de pantalla de búsqueda, el Controladores de vista infantil, los controladores de visualización de presentación y los controladores de vista presentados.

¿Existe un mejor enfoque para hacer esto desde el contenidoControlador de popover?

Respuesta

29

Desafortunadamente, tendrá que crear una referencia de propiedad débil a dicho UIPopoverController ya que no hay forma de acceder desde el controlador de vista de contenido.

Me sorprendió cómo UIViewControllers puede acceder al controlador de vista modal, el controlador de vista padre, el controlador de navegación, el controlador de vista dividida, el controlador de barra de pestañas, el controlador de visualización de búsqueda y, a partir de iOS 5, los controladores de vista infantil así como presentando y presentando controladores ... pero no el controlador de popover (los popovers aprobados no son UIViewController s, pero aún así).

Técnicamente, hay un método privado e indocumentado para recuperar el popoverController en el que está el UIViewController ... No tengo idea de por qué nunca lo hicieron público dado que debería ser exactamente igual que cualquiera de los controladores anteriores.

Aunque incluso en el mundo privado, no documentado, no hay equivalente a dismissModalViewcontrollerAnimated:. Aún tendrá que obtener esa referencia y luego descartarla de esa manera.

+1

Después de buscar en los documentos, me sorprendió también. Lamentablemente, esto agrega dependencias no deseadas en todo. – Maurizio

+0

En iOS8, puede tener una opción ahora: self.popoverPresentationController – Jacky

1

Otra manera de resolver esto es crear un controlador de vista abstracto (para todos los controladores de vista) que añade un observador NSNotification a un método como -(void)closePopoverIfNecessary:(NSNotification*)notification y tienen clases hijas opcionalmente poner en práctica el método para cerrar su popover (s) si abierto. Luego, desde el controlador de popover disparas la notificación para cerrarlo. También puede pasar otra información a través de la notificación (userInfo) si es necesario.

De esta manera no hay necesidad de las referencias de los padres.

+0

Con esto no se olvide de eliminar observadores en el 'dealloc' del controlador abstracto –

Cuestiones relacionadas