Запретить предупреждение о необъявленном селекторе в 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