У меня точно такая же проблема с подклассом UIViewController и этим фрагментом безобидного кода:
- (void)viewDidLoad
{
NSLog(@"%@ %s %@", [self class], _cmd, answerButton);
[self.answerButton addTarget:self
action:@selector(getAnswerToQuestion:)
forControlEvents:UIControlEventTouchUpInside];
}
Да, answerButton подключен (это IBOutlet), да, - (IBAction)getAnswerToQuestion:(id)sender;
- правильный метод, но не радость. Когда я закомментировал viewDidLoad и установил соединение в IB, в отчете о сбое было показано, что сбой происходит на [UIControl sendAction: to: forEvent:], что приводит к
имя селектора objc_msgSend (): executeSelector: withObject: withObject:
Я не могу это доказать, но я подозреваю, что где-то в UIKit есть ошибка, которая переводит привязки и addTarget в вызов executeSelector. Я планирую сначала обновить iOS 4.01, чтобы посмотреть, не решит ли это проблему.
UPDATE:
Я больше не уверен, что моя проблема действительно похожа на проблему Александра Кассана, но в целях обмена информацией я пока не буду ее удалять. Я решил свою проблему, как это часто случалось, когда я начал делать пример проекта, чтобы подать отчет об ошибке. Да, щелкнув по кнопке answerButton, вызов getAnswerToQuestion: вроде хорошего небольшого объекта, и все было в порядке.
Разница между подклассом UIViewController в примере проекта и проектом моего реального проекта заключалась в том, что первый также функционировал как владелец файла в xib, а второй был лишь одним из нескольких контроллеров представления. Когда я переместил getAnswerToQuestion: в владельца файла в моем реальном проекте, нажатие кнопки answerButton сработало, как и ожидалось. Итак, я догадывался, что проблема заключается где-то в переводе с привязки на executeSelector не так уж и далеко: проблема заключается в цепочке респондеров. Я думаю, что установление связи Action-Target либо программно, либо в IB обойдёт цепь респондентов, но, очевидно, нет.
Проблема сейчас, конечно, заключается в том, что Александр в своем вопросе заявляет, что его метод contentChanged: уже является частью владельца файла, что делает мой ответ неуместным для вопроса.