Как отладить проблему «нераспознанный селектор отправлен в экземпляр»? - PullRequest
6 голосов
/ 08 марта 2009

У меня есть следующий код в контроллере представления, который (во всех других отношениях), кажется, работает нормально:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ProblemViewController *problemViewController = [[ProblemViewController alloc] initWithNibName:@"ProblemViewController" bundle:nil];
    problemViewController.problem = (Problem*)[self.problems objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:problemViewController];
    [problemViewController release];
}

Однако, когда я запускаю эту функцию, я получаю следующую ошибку:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[ProblemViewController initWithNibName:bundle:]: unrecognized selector sent to instance 0x57ca80'

Я в растерянности относительно того, что может быть причиной, поэтому мой вопрос: как мне лучше всего заняться отладкой этой проблемы? Есть что-то очевидное, что я должен проверять?

Ответы [ 5 ]

6 голосов
/ 08 марта 2009

Проверьте базовый класс для ProblemViewController. Держу пари, что вы не наследуете от UIViewController, который включает метод initWithNibName:bundle:.

5 голосов
/ 08 ноября 2012

Существует множество ответов на этот вопрос, которые все в основном говорят одно и то же, правильное: почему-то метод, который вы пытаетесь вызвать, на самом деле не существует.

НО, если вы бьетесь головой о стену (как я сегодня целый час), обязательно сначала попробуйте очистить свой проект в xcode. Иногда я не знаю почему, xcode может попасть в плохое состояние и не сможет правильно скомпилировать ваш проект в симулятор. Он сообщит вам, что сборка прошла успешно, но при развертывании на симуляторе вы начнете видеть ошибки времени выполнения, как если бы была подобрана только половина ваших изменений. Так что да, это происходит.

2 голосов
/ 08 марта 2009

Скорее всего, этот метод не реализован в вашем ProblemViewController. Насколько мне известно, нераспознанный селектор состоит в том, что в интерфейсе этого класса не определен метод с такой подписью.

Попробуйте объявить это в своем интерфейсе так:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
1 голос
/ 13 августа 2011

Я поделюсь своим опытом с тем же кодом ошибки. Возможно ошибиться, назначив объект не той цели. Например, если у вас есть какое-либо свойство UILabel и вы случайно присвоили строковую константу непосредственно self.myUILabelProperty = @ "ups", тогда ваше свойство станет объектом типа NSString вместо UILabel, поэтому вы потеряете все методы UILabel. После этой ошибки, если вы попытаетесь использовать методы UIlabel для свойства в коде, вы получите это сообщение об ошибке.

1 голос
/ 06 ноября 2009

Я подумал, что лучше написать что-нибудь по этому вопросу. Я боролся с этим в течение нескольких дней. Есть много блогов по этому вопросу, но ни один из них не решил проблему. Некоторые предположили, что это связано с pushViewController, для которого нужно указать анимированный: ДА. Это сработало для некоторых, но это не сработало для проблемы, с которой я столкнулся. Я использовал кнопку для доступа к другому представлению вместо выбора строки в табличном представлении, но получал ту же самую нераспознанную ошибку селектора. Я также использовал навигационный контроллер, поэтому я подумал, что это как-то связано с этим, но это не так. Наконец, я решил закомментировать строки кода, пока сообщение не исчезло. После комментирования метода, который вызывал проблему, сообщение об ошибке все еще появлялось в консоли. Именно тогда я понял, что проблема не в моем исходном коде. Один сайт рекомендовал выполнить чистку и перестройку. Я попробовал все это, и проблема все еще сохранялась. Затем я посмотрел на свой файл XIB с помощью Interface Builder, чтобы увидеть, какие методы (полученные действия) отображаются в владельце файла. Была проблема. Метод владельца не только один раз обнаруживался у владельца файла, но и отображался дважды. Не знаю, как отобразить изображение здесь. Во всяком случае, я удалил методы (Полученные действия) с тем же именем, которое появилось в Владельце файла. Я выполнил очистку и перестройку, чтобы проверить, исчезла ли ошибка, и это произошло. Затем я раскомментировал источник, который мне показался плохим, и снова построил проект, и вызов нового представления прошел успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...