Como Ed Marty ya escribió
Si desea borrar un popover pulsando un botón, un lugar relevante debería mantener una referencia a la popover
Esto es muy cierto ; sin embargo, al mostrar un UIPopoverController, la clase que abre el controlador popover mantiene este recurso ya. Entonces, lo que podrías hacer es usar esta clase como la clase delegada para tu Controlador Popover.
Para hacerlo, puede hacer lo siguiente, que utilizo en mi código. En la clase de abrir el popover, este es mi código:
- (void)showInformationForView:(Booking*)booking frame:(CGRect)rect
{
BookingDetailsViewController *bookingView = [[BookingDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped booking:booking];
[bookingView setDelegate:self];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:bookingView];
self.popController = [[UIPopoverController alloc] initWithContentViewController:navController];
[self.popController setDelegate:self];
[self.popController setPopoverContentSize:CGSizeMake(320, 320)];
rect.size.width = 0;
[self.popController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
- (void)dismissPopoverAnimated:(BOOL)animated
{
[self.popController dismissPopoverAnimated:animated];
}
Entonces, ¿qué estoy haciendo aquí es la creación de un UINavigationController
y el establecimiento de un BookingDetailsViewController
como su rootViewController
. Luego también agrego la clase actual como delegado a este BookingDetailsViewController
.
Lo segundo que agregué es un método de destitución llamado dismissPopoverAnimated:animated
.
En mi BookingDetailsViewController.h
I añade el siguiente código:
[...]
@property (nonatomic, strong) id delegate;
[...]
Y en mi BookingDetailsViewController.m
He añadido este código:
[...]
@synthesize delegate = _delegate;
- (void)viewDidLoad
{
UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(closeView)];
[self.navigationItem setRightBarButtonItem:closeButton];
[super viewDidLoad];
}
- (void)closeView
{
if ([self.delegate respondsToSelector:@selector(dismissPopoverAnimated:)]) {
[self.delegate dismissPopoverAnimated:YES];
}
else {
NSLog(@"Cannot close the view, nu such dismiss method");
}
}
[...]
Lo que sucede es que cuando el botón "Cerrar" en el UINavigationController es presionado, se llama al método closeView
. Este método verifica si el delegado responde al dismissPopoverAnimated:animated
y si es así, lo llama. Si no responde a este método, mostrará un mensaje de registro y no hará nada más (por lo que no se bloqueará).
He escrito mi código usando ARC, por lo tanto no hay administración de memoria.
Espero que esto te haya ayudado.
gracias. ¡Cambiaré el código! – SpaceDog
El segundo párrafo es extremadamente importante en esta respuesta. Recuerde, de acuerdo con la Guía de programación de iPad: "Tenga en cuenta, sin embargo, que es su responsabilidad almacenar una referencia al controlador Popover para que pueda descartarlo. El sistema no proporciona uno por defecto". Por lo tanto, no hagas un "lanzamiento" en él (causará un bloqueo de todos modos) hasta que la vista principal haya entrado en la fase dealloc. (ese es mi método de seguridad). – Jann
simplemente use [autodesculuntarVerControllerAnimated: YES completion: nil]; "El controlador de visualización de presentación es responsable de descartar el controlador de vista que presentó. Si llama a este método en el controlador de vista presentado, automáticamente reenvía el mensaje al controlador de vista que se presenta". –