2015-04-27 2 views
0

Так что я использую respondsToSelector: и большую часть времени он отлично работает. Но есть один случай, которым я получаю неправильный результат:отвечаетSoSelector возвращает YES для «setTitle:» на UIButton, но такого селектора нет

UIButton* button = [[UIButton alloc] init]; 
if([button respondsToSelector:NSSelectorFromString(@"setTitle:")]) // returns YES 
{ 
    // try to call "setTitle:" 
} 

respondsToSelector: возвращает YES, но нет никаких setTitle: селектора в классе UIButton. Существует setTitle:forState: селектор, но это определенно не то же самое.

Почему respondsToSelector: возвращает ДА?

+1

откликается на селектор не только проверить открытый интерфейс, он будет принимать какой-либо метод, который он может найти. Это не значит, что вы должны использовать его таким образом. Почему вы его используете? – Wain

+0

@Wain, 'Ответ на селектор не просто проверяет публичный интерфейс' Ну, это был бы ответ ... Отправьте его, и я проверю его как правильный. Спасибо) – Alexandr

ответ

1

Ответы на селектор не только проверяют открытый интерфейс, но и любой способ, который он может найти. Я не помню, чтобы ранний API для UIButton когда-либо отображал заголовок напрямую, но внутренне он, скорее всего, называется изменением состояния.

Попробуйте использовать только respondsToSelector: для API, что вы на самом деле нужно проверить, существует, и обратите внимание, что часто частный API, который позже обнародовано, и что это также может вызвать интересные ситуации ...

0

Александр, Вы должен использовать этот метод «replysToSelector» только тогда, когда вы хотите проверить, реализует ли объект метод, который вы собираетесь вызывать. И для установки Button Title, почему вы должны использовать это?

Вы должны использовать этот метод в основном вы работаете с методами пользовательского делегата ..