2010-11-17 22 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