2010-11-17 1 views
2

настоящее время я использую -respondsToSelector: так:RespondsTeSlector возвращает ложноотрицательный?

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

где MoviePlayer является проиллюстрированный объект MPMoviePlayerController. Я делаю много других подобных проверок селектора, поэтому я знаю, что в значительной степени все остальное работает нормально, но по какой-то причине эта реакция возвращает проверкуToSelector, возвращает false, даже если я делаю что-то вроде time = [moviePlayer currentPlaybackTime], он отлично работает. Это на 4.0+ iOS, поэтому нет причин для возврата false.

Любые причины, по которым это произойдет?

ответ

1

В соответствии с ссылкой на класс iOS, currentPlaybackTime является собственностью MPMusicPlayerController, а не 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 (см комментарии)

Определить версию ОС:

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

if (iPhoneOSVersion < 3.2) 
{ 

} 
else 
{ 

} 
+0

MPMoviePlayerController также соответствует протоколу MPMediaPlayback в 3,2. CurrentPlaybackTime является обязательным свойством в этом протоколе, что означает, что MPMoviePlayerController должен реализовать эти методы начиная с 3.2. В общем, currentPlaybackTime является общедоступным, у которого есть аксессор (который просто -currentPlaybackTime). Это также не имеет значения, если оно задокументировано или нет; [moviePlayer currentPlaybackTime] отвечает действительным возвращаемым значением, но отвечаетSoSelector для этого селектора возвращает NO. Он документируется, не меняет, реализовано это или нет. –

+0

Я удивлен, что Apple не опубликовала эту протокольную конформацию в ссылке класса MPMoviePlayerController. Один вопрос - почему вы проверяете 'responsesToSelector', если этот экземпляр соответствует этому протоколу? –

+0

Да, это действительно странно. Это, однако, в общедоступном файле .h для MPMoviePlayerController. Я проверяю responsesToSelector, потому что это метод, который стал доступен только начиная с 3.2. Мое приложение поддерживает до 3,0, поэтому я должен проверить его, чтобы избежать исключений во время выполнения. –

Смежные вопросы