Antes de iOS 4, solía agregar un observador a cada MKAnnotationView
agregado a la vista de mapa, escuchando su método seleccionado, así sé cuándo el usuario ha tocado un alfiler.¿Cómo probar un protocolo para un método?
Esto funcionó bien hasta iOS 4.2. Me di cuenta en el lanzamiento que las vistas de anotación notadas están siendo reutilizadas y de alguna manera se equivoca con los observadores.
Me imagino que puedo usar el método -mapview:didSelectAnnotationView:
de MKMapViewDelegate
para mis necesidades, pero eso solo se ha agregado al iOS 4.0 SDK.
Entonces, para mantener la compatibilidad, me gustaría implementar este método en mi delegado y verificar condicionalmente la presencia de este método en el protocolo MKMapViewDelegate
para que, si no está presente, agregue mi observador a la vista de anotación .
¿Cómo puedo hacer esto para un método de protocolo, del mismo modo para la forma en que verificamos si una clase no es nula?
ACTUALIZACIÓN:
Como Daniel Dickison señaló, no puedo usar respondsToSelector:
, porque mi delegado ha implementado para -mapview:didSelectAnnotationView:
4.0+ dispositivos. Lo que necesito es verificar si el protocolo en ese dispositivo tiene el método -mapview:didSelectAnnotationView:
opcional O si MKMapView
buscará ese método en su delegado.
Terminé haciendo una prueba para la versión actual de iOS en ejecución. Si es superior a 4.0, MKMapView
buscará ese método y lo llamará.
if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 4.0)
[self setupObserver];
Esto resuelve el problema original, pero aún sería interesante comprobar el protocolo real para el método de alguna manera.
Chris - puede que no desee utilizar la palabra clave reservada seleccionar como el nombre de la variable SEL. – DHamrick
@DHamrick, tienes toda la razón ... tan tonto ... Lo escribí rápidamente y tenía una palma de la cara ... –
¡No puedes usar "respondsToSelector" porque el único objeto que le pedirías es a ti mismo! Necesita averiguar si MKMapView buscará ese método de un delegado ... –