20

respondsToSelectorで実行して、iOS6固有の外観メソッドを検出しようとしてい[UIBarButtonItem appearance]ます。ただし、指定したセレクターが何であれ、常に返さNOれます。

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

実際にこれらの方法を使用すると、それぞれのバージョンのiOSで問題なく機能しますが、どちらが利用できるかを検出できないようです。では、どうすればそれを適切に行うことができますか?

4

1 に答える 1

36

外観プロキシをチェックしないでください。それはプロキシなので、決して信頼することはできません。代わりに、新しいメソッドを持つアイテム(この場合は:)を直接チェックしてください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...");
于 2012-09-19T23:42:57.100 に答える