objective-c xcode ios5 ios6 uiappearance

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...");