objective c - cache - UIButton no se carga correctamente para MKAnnotationView
sdwebimage ios (1)
Estoy creando una MKAnnotationView con un botón de divulgación de detalles.
En mapView: viewForAnnotation: simplemente creo un botón de marcador de posición.
// the right accessory view needs to be a disclosure button ready to bring up the photo
aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
En mapView: didSelectAnnotationView: en realidad creo un botón para usar (con la etiqueta correspondiente)
// create a button for the callout
UIButton *disclosure = [self.delegate mapController:self buttonForAnnotation:aView.annotation];
NSLog(@"DisclosureButton: %@", disclosure);
// set the button''s target for when it is tapped upon
[disclosure addTarget:self.delegate action:@selector(presentAnnotationPhoto:) forControlEvents:UIControlEventTouchUpInside];
// make the button the right callout accessory view
aView.rightCalloutAccessoryView = disclosure;
En el registro, el botón parece estar completamente instanciado y configurado con la etiqueta correcta.
Este es el creador de botones:
/**
* returns an button for a specific annotation
*
* @param sender the map controller which is sending this method to us (its'' delegate)
* @param annotation the annotation we need to create a button for
*/
- (UIButton *)mapController:(MapController *) sender
buttonForAnnotation:(id <MKAnnotation>) annotation
{
// get the annotation as a flickr photo annotation
FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *)annotation;
// create a disclosure button used for showing photo in callout
UIButton *disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
// associate the correct photo with the button
disclosureButton.tag = [self.photoList indexOfObject:fpa.photo];
return disclosureButton;
}
El problema surge cuando selecciono la anotación. Durante unos segundos, cuando se selecciona la anotación y se toca el botón de divulgación de detalles, no sucede nada. Sin embargo, después de tocar y volver a la anotación varias veces y probar el botón, finalmente funciona como se esperaba.
¿Qué está pasando con la extraña demora? A veces, cuando el botón va a funcionar, simplemente aparece como si el alfa estuviera en 0.0 hasta que lo toques y aparezca.
En serio, uno de los problemas más extraños que he encontrado.
Antes de didSelectAnnotationView
método de delegado didSelectAnnotationView
, la vista de mapa ya ha preparado la vista de llamada en función de las propiedades de la vista de anotación (antes de los cambios).
Por lo tanto, el texto destacado que ve en el primer toque es sin los cambios que hace la aplicación en didSelectAnnotationView
. En los siguientes toques, la llamada podría basarse en los valores establecidos en el toque anterior (esto realmente depende de cómo se maneje la reutilización de la vista de anotación en viewForAnnotation
).
Parece que las únicas cosas que hace el código en didSelectAnnotationView
y buttonForAnnotation
es establecer la acción del botón y la etiqueta.
Supongo que está utilizando el enfoque de "etiqueta" porque el método presentAnnotationPhoto:
Anotación de una presentAnnotationPhoto:
necesita hacer referencia a las propiedades de la anotación seleccionada.
No necesita usar una etiqueta para obtener la anotación seleccionada en su método de acción. En cambio, hay un par de mejores opciones:
- El método de acción personalizado puede obtener la anotación seleccionada de la propiedad Anotaciones de la vista del mapa. Vea esta pregunta para ver un ejemplo de cómo hacer esto.
- Utilice el método delegado de la vista de mapa
calloutAccessoryControlTapped
lugar de un método de acción personalizado. El método de delegado pasa una referencia a la vista de anotación que contiene una propiedad que apunta a su anotación (es decir,view.annotation
) por lo que no hay adivinanzas, búsquedas o preguntas sobre qué anotación se seleccionó. Recomiendo esta opción
En la primera opción, addTarget
en viewForAnnotation
y no se moleste en configurar la tag
. Tampoco necesita el método buttonForAnnotation
. Luego, en el método de acción del botón, obtenga la anotación seleccionada de mapView.selectedAnnotations
.
Actualmente, su método de acción es self.delegate
por lo que podría tener problemas para acceder a la vista de mapa desde ese otro controlador. Lo que puede hacer es crear un método de acción de botón local en el controlador de mapa que obtiene la anotación seleccionada y luego llama al presentAnnotationPhoto:
método de acción en self.delegate
(excepto que ahora ese método se puede escribir para aceptar un parámetro de anotación en lugar de un botón manejador de tap).
La segunda opción es similar, excepto que no necesita hacer ningún addTarget
y en el método calloutAccessoryControlTapped
, llame a self.delegate
presentAnnotationPhoto:
en self.delegate
.
Para ambas opciones, sugiero modificar el método presentAnnotationPhoto:
para aceptar el objeto de anotación mismo ( FlickrPhotoAnnotation *
) en lugar del UIButton *
actual y en el controlador de mapa, hacer un addTarget en un método local para el controlador de mapa (o usar calloutAccessoryControlTapped) y desde ese método, llame manualmente a presentAnnotationPhoto:
y páselo por la anotación.