2010-11-17 27 views
2

我目前使用-respondsToSelector:像这样:RespondsToSelector返回一个假阴性?

if (![moviePlayer respondsToSelector:@selector(currentPlaybackTime)]) { 
    NSLog(@"Cannot get current playbackTime on %@", moviePlayer); 
    return; 
} 

其中moviePlayer是一个实例化的MPMoviePlayerController对象。我做了很多其他类似的选择器检查,所以我知道几乎所有其他工作都正常,但由于某种原因,此respondsToSelector检查返回false,即使如果我做类似time = [moviePlayer currentPlaybackTime],它工作正常。这是在iOS 4.0以上,所以没有理由返回false。

为什么会出现这种情况?

回答

1

根据iOS类参考, currentPlaybackTimeMPMusicPlayerController的财产,而不是 MPMoviePlayerController

MPMusicPlayerController: http://developer.apple.com/library/ios/#documentation/MediaPlayer/Reference/MPMusicPlayerController_ClassReference/Reference/Reference.html

的MPMoviePlayerController: http://developer.apple.com/library/ios/#documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/MPMoviePlayerController/MPMoviePlayerController.html

这可能是因为不具有访问的 MPMoviePlayerController的私人财产。

EDIT(见注释)

确定OS版本:

float iPhoneOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; 

if (iPhoneOSVersion < 3.2) 
{ 

} 
else 
{ 

} 
+0

的MPMoviePlayerController也符合MPMediaPlayback协议为3.2。 CurrentPlaybackTime是该协议中必需的属性,这意味着MPMoviePlayerController必须从3.2开始实现这些方法。总而言之,currentPlaybackTime是一个公共属性,它有一个访问器(这简直就是-currentPlaybackTime)。它是否有文件记录也无关紧要; [moviePlayer currentPlaybackTime]确实用有效的返回值进行响应,但该选择器的respondsToSelector返回NO。它的记录不会改变它是否实施。 – 2010-11-17 22:27:18

+0

我很惊讶Apple没有在MPMoviePlayerController类的引用中发布协议构造。一个问题 - 为什么你检查'respondsToSelector'如果该实例符合该协议? – 2010-11-17 22:34:48

+0

是的,这真的很奇怪。但是,它在MPMoviePlayerController的公共.h文件中。我正在检查respondsToSelector,因为它是一个只能从3.2开始可用的方法。我的应用程序支持到3.0,所以我必须检查它以避免运行时异常。 – 2010-11-17 22:41:29