iphone ios cocoa-touch uipopovercontroller

iphone - ¿Desechando un UIPopoverController desde su contentViewController?



ios cocoa-touch (2)

Si desea descartar una ventana emergente, por ejemplo, desde un botón dentro del contentViewController de la ventana emergente, debe:

  1. Cree una referencia a la ventana emergente que retendrá el controlador de vista que la crea.
  2. Cree una notificación desde el contentViewController para que el controlador de la vista propietaria sepa que debe ser descartado, o cree un delegado alternativamente para el mismo propósito
  3. Envíe la notificación o el mensaje delegado cuando la ventana emergente esté lista para ser descartada
  4. Llamar a un dismissPopover:animated cuando se llama a la notificación o al método delegado

Mientras tanto, desde un UIViewController puede acceder al controlador de vista modal, el controlador de vista principal, el controlador de navegación, el controlador de vista dividida, el controlador de la barra de pestañas, el controlador de visualización de búsqueda, los controladores de vista secundarios, los controladores de vista de presentación y el controlador presentado. Controladores de vista.

¿Hay un mejor enfoque para hacer esto desde el contentViewController de popover?


Desafortunadamente, tendrá que crear una referencia de propiedad débil para 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 principal, el controlador de navegación, el controlador de vista dividida, el controlador de la barra de pestañas, el controlador de visualización de búsqueda y, a partir de iOS 5, los controladores de vista secundarios, además de presentar y presentó los controladores ... pero no el controlador de popover (los UIViewController otorgados no son UIViewController s, pero aún así).

Técnicamente, hay un método privado e indocumentado para recuperar el controlador emergente en el que se encuentra el controlador UIView ... No tengo idea de por qué nunca lo hicieron público, ya que debería ser exactamente el mismo que cualquiera de los controladores anteriores.

Aunque incluso en el mundo privado e indocumentado, no hay un equivalente para dismissModalViewcontrollerAnimated: al dismissModalViewcontrollerAnimated: de dismissModalViewcontrollerAnimated: de dismissModalViewcontrollerAnimated: Aún tendrás que obtener esa referencia y luego descartarla de esa manera.


Otra forma de resolver esto es crear un controlador de vista abstracta (para todos sus controladores de vista) que agregue un observador NSNotification a un método como -(void)closePopoverIfNecessary:(NSNotification*)notification y que las clases secundarias implementen opcionalmente el método para cerrar su popover (s) si está abierto. Luego, desde dentro del controlador del popover, dispara la notificación para cerrarla. 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.