NSCFString или UIViewController? - PullRequest
0 голосов
/ 05 августа 2010

Я использую UIViewController (конечно, подкласс) с текстовым полем, которое отправляет действие при изменении содержимого (на contentChanged: селектор ViewController). Это делается отправкой contentChanged: владельцу файла в IB. Но когда я проверяю его, он говорит: «- [NSCFString contentsChanged:]: нераспознанный селектор отправлен в экземпляр» и указатель экземпляра в шестнадцатеричном виде. Я предполагаю, что по какой-то причине контроллер представления перемещается на другой указатель и там выделяется строка, но я не могу понять, почему. Есть идеи?

Ответы [ 4 ]

3 голосов
/ 06 августа 2010

Походит на классический случай. Прочтите NSZombieEnabled о том, как отследить такого рода проблемы.

1 голос
/ 05 августа 2010

У меня точно такая же проблема с подклассом 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: уже является частью владельца файла, что делает мой ответ неуместным для вопроса.

0 голосов
/ 06 августа 2010

вам следует рассмотреть возможность использования протокола UITextFieldDelegate для обратного вызова при изменении текста UITextField.Я не смотрел, но это то, что я хотел бы сделать с макушкой.

0 голосов
/ 05 августа 2010

, не глядя на код, похоже, что вы вызываете contentsChanged: для текста текстового поля вместо подкласса UIViewController.

...