Objective-C Вызов селектора, который не верит компилятору, существует (даже если мы знаем, что он существует) - PullRequest
5 голосов
/ 31 марта 2012

У меня есть этот код в методе prepareForSegue

    // Get destination view
    UIViewController *viewController = [segue destinationViewController];

    //See if it responds to a selector
    if ([viewController respondsToSelector:@selector(setSomethingOrOther:)]) {
        //if so call it with some data
        [viewController setSomethingOrOther:something];
    }

Приведенный выше код означает, что мне не нужно включать ссылку на фактический класс контроллера представления, к которому относится segue'd.Я могу более свободно соединить два контроллера представления и просто проверить, реагирует ли он на какое-то свойство, установленное на нем.

Проблема в том, что когда я делаю это, я получаю следующую ошибку времени компиляции:

Нет видимого @interface для «UIViewController» объявляет селектор «setSomethingOrOther:»

, что, конечно, верно.Я знаю, что смогу обойти это, включив ссылку на представление, но я бы предпочел оставить это разделенным.Как я могу обойти это

Ответы [ 3 ]

11 голосов
/ 31 марта 2012

Используйте метод performSelector:aSelector, затем вы можете вызвать необъявленный селектор.

7 голосов
/ 31 марта 2012
[viewController performSelector:@selector(setSomethingOrOther:) 
                     withObject:something];
3 голосов
/ 31 марта 2012

Вы также можете сделать это

[(id)viewController setSomethingOrOther:something];

в некоторых ситуациях, но я, компилятор, будет жаловаться, если он не знает о существовании setSomethingOrOther: вообще как библиотека, для которой вы не включили заголовок.

...