respondsToSelector は外観プロキシで失敗します 質問する

respondsToSelector は外観プロキシで失敗します 質問する

respondsToSelectorを実行して、iOS 6 固有の外観メソッドを検出しようとしています[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 で問題なく動作しますが、どのメソッドが使用可能かを検出できないようです。 では、どうすれば適切に実行できるのでしょうか?

ベストアンサー1

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

おすすめ記事