2012-09-19 19 views
20

Estoy tratando de detectar un método de apariencia específico de iOS 6, ejecutando respondsToSelector en el [UIBarButtonItem appearance]. Sin embargo, siempre devuelve NO para mí, cualquiera que sea el selector especifico:respondsToSelector falla para proxy de apariencia

// Should show NOPE in iOS 5, YEP in iOS 6. Shows NOPE always 
NSLog(@"%@", [[UIBarButtonItem appearance] respondsToSelector:@selector(setBackgroundImage:forState:style:barMetrics:)] ? @"YEP" : @"NOPE"); 

// Should show YEP in both iOS 5 and iOS 6. Shows NOPE always 
NSLog(@"%@", [[UIBarButtonItem appearance] respondsToSelector:@selector(setBackgroundImage:forState:barMetrics:)] ? @"YEP" : @"NOPE"); 

En realidad el uso de estos métodos funciona bien en sus respectivas versiones de iOS, pero me parece que no puede detectar cuál está disponible para mí. Entonces, ¿cómo hago correctamente eso?

Respuesta

36

No verifique el proxy de apariencia. Nunca puedes confiar en eso, ya que es un proxy. En su lugar, verifique directamente el artículo que tiene el nuevo método, en este caso, el UIBarButtonItem:

BOOL hasNewMethod = [UIBarButtonItem instancesRespondToSelector:@selector(setBackgroundImage:forState:style:barMetrics:)]; 
if(hasNewMethod) 
    NSLog(@"Running iOS 6 with new method"); 
else 
    NSLog(@"Current OS doesn't support method..."); 
+1

+1 ¡Usted es brillante! – bgolson

Cuestiones relacionadas