objective c - respondsToSelector falla por apariencia de proxy
objective-c xcode (1)
Estoy intentando detectar un método de apariencia específico de iOS 6, ejecutando respondsToSelector
en el [UIBarButtonItem appearance]
. Sin embargo, siempre devuelve NO
para mí, independientemente del selector que especifique:
// 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, usar esos métodos funciona bien en sus respectivas versiones de iOS, pero parece que no puedo detectar cuál está disponible para mí. Entonces, ¿cómo puedo hacer eso correctamente?
No verifique el aspecto del proxy. Nunca puedes confiar en eso, ya que es un proxy. En su lugar, verifique directamente el elemento 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...");