Después de un trabajo, tengo una vista de popover que muestra una uiview personalizada dentro de la que aparece correctamente. Cuando toca fuera de la vista de popover descarta como se esperaba, sin embargo, también me gustaría descartarla cuando se toca un botón dentro de ella, ¿hay alguien que pueda ayudarme con eso? Luchando por encontrar una guía concisa.Cómo configurar las vistas de Popover para que se eliminen correctamente
6
A
Respuesta
12
Para descartar el popover manualmente, deberá mantener una referencia al mismo. Un buen lugar sería en el controlador de vista que muestra el popover.
Para que el botón dentro del controlador de vista de contenido indique al controlador de vista original (que presentó el popover) que descarte el popover, dos de las formas posibles son delegar + protocolo o NSNotificationCenter.
El código de ejemplo siguiente utiliza NSNotificationCenter.
En el .h del controlador de vista que presenta el popover ("PresenterViewController"), añadir una propiedad para el popoverViewController:
@interface PresenterViewController : UIViewController {
...
UIPopoverController *popoverController;
}
...
@property (nonatomic, retain) UIPopoverController *popoverController;
@end
En el .m de PresenterViewController:
@synthesize popoverController;
...
- (void)showPopover
{
if (self.popoverController == nil)
{
ContentFooViewController *content =
[[ContentFooViewController alloc] init];
UIPopoverController *popover = [[UIPopoverController alloc]
initWithContentViewController:content];
[content release];
self.popoverController = popover;
[popover release];
// Listen for the "done" notification which will be posted
// by the button in the content view controller.
// When the notification is received,
// call the contentFooViewControllerDone: method...
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(contentFooViewControllerDone:)
name:@"contentFooViewControllerDone"
object:popoverController.contentViewController];
}
[self.popoverController presentPopoverFromRect:...
// OR
[self.popoverController presentPopoverFromBarButtonItem:...
}
- (void)contentFooViewControllerDone:(NSNotification *)notification
{
// Button in content view controller was tapped, dismiss popover...
[self.popoverController dismissPopoverAnimated:YES];
}
- (void)dealloc
{
//stop listening for notifications and release popoverController...
[[NSNotificationCenter defaultCenter] removeObserver:self];
[popoverController release];
[super dealloc];
}
En el controlador de vista de contenido, implemente el método de toque del botón de la siguiente manera:
- (IBAction)dismissButtonTapped
{
[[NSNotificationCenter defaultCenter]
postNotificationName:@"contentFooViewControllerDone" object:self];
}
Cuestiones relacionadas
- 1. ¿Cómo evito que se eliminen ciertas funciones?
- 2. ¿Cómo configurar el contenedor OpenEJB integrado para las pruebas correctamente?
- 3. Cómo configurar correctamente NSFetchedResultsController
- 4. ¿Cómo configurar metadatos para iPhone que maneja la rotación correctamente?
- 5. Obtener ID para las vistas que se agregan dinámicamente
- 6. ¿Cómo se prueba si las vistas de Backbone.js se están desencadenando() y destruyendo() correctamente?
- 7. ¿Cómo hacer que las secuencias de comandos se eliminen automáticamente al final de la ejecución?
- 8. (Vibrating TextView) Configurar atributos para vistas personalizadas
- 9. Popover personalizado para iPad/iPhone
- 10. Express.js + Less: cómo configurar correctamente
- 11. ¿Cómo configurar una alarma para que se active correctamente en un tiempo fijo?
- 12. ¿Se puede configurar Hudson para que construya todas las revisiones?
- 13. ¿Cómo evito que los elementos vacíos que se eliminan se eliminen al dividir cadenas?
- 14. iPhone: las vistas que se abren muestran un fondo blanco
- 15. Evitar que ciertas filas se eliminen en Oracle
- 16. Deslizar para cambiar las vistas
- 17. ¿Cómo configurar correctamente el adaptador de sincronización?
- 18. ¿Cómo verificar que todas las tareas se hayan completado correctamente?
- 19. ¿Cómo puedo recortar una lista <string> para que se eliminen las líneas en blanco precedentes y siguientes?
- 20. Cómo configurar correctamente Ctrl-Tab en Emacs
- 21. ¿Las vistas se actualizan automáticamente
- 22. Cómo configurar correctamente la zona horaria mysql
- 23. ¿Para qué sirven las vistas?
- 24. En GIT, ¿cómo puedo evitar que las personas cambien o eliminen confirmaciones que ya se han enviado?
- 25. Cómo configurar Doxygen para documentar correctamente las categorías de Objective-C
- 26. ¿Cómo se asegura de que el código se reutilice correctamente?
- 27. ¿Cómo configurar .htaccess para Kohana correctamente, para que no haya feo "index.php /" en la URL?
- 28. ¿Cómo configurar correctamente una NSPredicate para una relación de muchos cuando se utilizan datos principales?
- 29. Cómo configurar Silverlight CurrentUICulture/CurrentCulture correctamente?
- 30. ¿Usa sugerencias para las vistas?
Uno Es importante tener en cuenta que si cierra el popover tocando fuera de él, nunca se cerrará correctamente, ya que todavía tiene una referencia al mismo. Esto está bien si no te importa tener un controlador de vista adicional, pero normalmente la memoria es muy alta y no quieres hacer esto. Entonces, también debería usar '- (void) popoverControllerDidDismissPopover: (UIPopoverController *) popoverController' para establecer la propiedad en nil. – memmons
@Hark: Buen punto, gracias. – Anna
Esto es genial, para otros también hay que tener en cuenta que Apple no recomienda tener un botón simplemente para cerrar un popover. Es probable que tu aplicación haga algo más con ese botón también, lo cual está bien. :) – ekinnear