Tengo un MKMapView (también un UIPopoverControllerDelegate) con Anotaciones. Este MapView tiene, en el archivo MKTestMapView.h, un UIPopoverController* popoverController
definido en la interfaz @ y un @property (nonatomic, retain) UIPopoverController* popoverController;
definido fuera de la sección @interface
. Este controlador es @synthesized
en el archivo MKTestMapView.m y se publica en la sección - (void)dealloc
. Las anotaciones en este MapView tienen rightCalloutAccessoryView
s definidas a lo siguiente:Cómo descartar el PozoAnimado en iPad con UIPopoverController en MKMapView (SDK3.2)
- (void)mapView:(MKMapView *)mapView2 annotationView:(MKAnnotationView *)aview calloutAccessoryControlTapped:(UIControl *)control{
...
CGPoint leftTopPoint = [mapView2 convertCoordinate:aview.annotation.coordinate toPointToView:mapView2];
int boxDY=leftTopPoint.y;
int boxDX=leftTopPoint.x;
NSLog(@"\nDX:%d,DY:%d\n",boxDX,boxDY);
popoverController = [[UIPopoverController alloc] initWithContentViewController:controller];
popoverController.delegate = self;
CGSize maximumLabelSize = CGSizeMake(320.0f,600.0f);
popoverController.popoverContentSize = maximumLabelSize;
CGRect rect = CGRectMake(boxDX, boxDY, 320.0f, 600.0f);
[popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
...
}
Ahora aquí viene la parte divertida. En primer lugar, no estoy seguro si necesito que maximumLabelSize
y rect
sean del mismo tamaño. Soy nuevo en el controlador de popover así que estoy jugando esto de oído ...
Bien, el popover muestra. Ahora a descartarlo. Puedo hacer clic en cualquier lugar en mapView2 y el popover se va ... pero necesito que el usuario haga clic en un botón en la vista si cambian algo. ¡URGH!
Los documentos muestran:
despedir a un popover mediante programación, llamada la dismissPopoverAnimated: método del controlador popover.
Bueno, aquí está el problema: Por definición de cómo funciona el popoverController, que hace clic dentro la vista de la popover mostrado (hacer clic en el botón), pero tienen que activar el método del controlador dismissPopoverAnimated:
que lanzó esta vista de popover, en mi caso, popoverController
dentro del archivo MKTestMapView.m.
Ahora, habiendo dicho todo esto, recordemos, [popoverController release]
no sucede hasta que:
- (void)dealloc {
[popoverController release];
[mapView release];
[super dealloc];
}
Por lo tanto, me acaba de hacer lo siguiente dentro del botón (desordenado pero puede funcionar):
(suponiendo mi punto de vista es un popover TableView) En el:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MKTestMapView * mKTestMapView = [[MKTestMapView alloc] init];
[[mKTestMapView popoverController].dismissPopoverAnimated:YES];
}
Aquí está mi problema: no puedo averiguar si hacer lo anterior me da una reference
(si no es tal una cosa) a la vista existente que está en la pantalla y, por lo tanto, a la vista que es el propietario de ese popoverController. Si es tan simple como
[[[self parentView] popoverController].dismissPopoverAnimated:YES];
voy a pegarme un tiro porque yo no creo que es la sintaxis correcta, ya sea!
Esto debería ser fácil ... pero estoy perdido. (Probablemente frustrado con tantas diferencias de iPad que estoy aprendiendo).
¿Alguien puede explicar más?
Por mucho que me gusta este: si (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) porque no puede usarlo en una aplicación universal o en una aplicación anterior a la 3.2, voy a marcar esto como la respuesta porque esto: [detailController setPopover: aPopover]; es lo que necesitaba Thx – Jann
Sí, estoy de acuerdo. No tuve mucha elección dado mi horario, pero lo cambiaré "en el futuro". ¡Me alegro de poder ayudar! Saludos, Paul –
@Jann "porque no puede usarlo en una aplicación universal o en una aplicación anterior a la 3.2". Sí tu puedes. Siempre que su SDK base sea 3.2, se ejecutará correctamente cuando se implemente en dispositivos pre-3.2. – user102008