Запретить предупреждение о необъявленном селекторе в Xcode 5
У меня есть родительский контроллер представления и контроллер дочернего представления. В представлении контроллера детского просмотра у меня есть UIButton, называемый "startButton". К этой кнопке я добавил цель, как показано ниже
[startButton addTarget:[self parentViewController] action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];
Я реализовал метод test: в родительском контроллере, и это отлично работает для меня. Когда кнопка нажата, событие передается из контроллера детского представления в родительский контроллер представления и фрагменты кода в тесте: метод запускается.
Но моя проблема в том, что я получаю предупреждающее сообщение: "Undeclared selector test:". Я знаю, я получаю его, потому что тест: не реализован в файле реализации контроллера дочернего представления.
Есть ли способ подавить это предупреждение? Большинство предложений, которые я видел здесь, заставляют все предупреждения подавляться, но я хочу подавить вышеупомянутое предупреждение.
Спасибо
Ответы
Ответ 1
Если вы точно знаете, что сделали правильные вещи, и код действительно работает нормально, вы можете остановить Xcode, предупреждая вас об этом, окружив метод с помощью команд препроцессора #pragma clang.
Например:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
[startButton addTarget:[self parentViewController] action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];
#pragma clang diagnostic pop
Любые "недостающие сообщения" между командами push и pop не сообщаются Xcode. Я предлагаю иметь как можно меньше кода между ними, чтобы предотвратить непредвиденные проблемы в вашем коде.
Ответ 2
Нет необходимости подавлять предупреждение, если вы можете его избежать:
Объявить метод test:
в интерфейсе (файл .h) родительского контроллера представления,
и импортировать этот файл .h в файл реализации контроллера дочернего представления.().
Затем компилятор знает о методе, и вы не получаете предупреждения о
необъявленный селектор.
Ответ 3
Следующий код заставит это предупреждение исчезнуть (dynamic create selector).
Но он выйдет из строя во время выполнения, если он не объявлен в parentviewcontroller.
[startButton addTarget:[self parentViewController] action:NSSelectorFromString(@"test:") forControlEvents:UIControlEventTouchUpInside];
Ответ 4
Вы всегда можете реализовать тест: в контроллере дочернего представления и выполните следующие действия:
- (void)test:(Parameters)param {
[self.parentViewController test:param];
}
Изменить цель на self вместо [self parentViewController]
Ответ 5
Другой вариант - объявить его в протоколе (в том же файле, что и использование селектора или заголовок, который он включает):
@protocol DummyProtocolToForwardDeclareSelector
-(void)test:(BOOL)testArgument;
@end
Это будет подавлять предупреждения только для этого конкретного селектора, но вы можете добавить других в тот же протокол.
Ответ 6
Еще один и, возможно, более правильный вариант - расширить интерфейс класса, который имеет метод, ориентированный на селектор.
@interface ClassThatHasTargetOfSelector ()
-(void)test:(BOOL)testArgument;
@end