ошибка «нераспознанный селектор отправлен в экземпляр» в Objective-C - PullRequest
146 голосов
/ 16 марта 2010

Я создал кнопку и добавил для нее действие, но как только он вызвал, я получил эту ошибку:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

Это мой код:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}

Ответы [ 36 ]

0 голосов
/ 12 октября 2012

Я отвечаю Леонарду Чаллису, так как я также принимал Stanford iOS класс C193P, как и пользователь "oli206"

"Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина:"

Проблема заключалась в том, что у меня дважды была подключена кнопка «Ввод» на калькуляторе, и друг указал, что проверка кнопки в раскадровке показала, что 2 записи были в атрибутах «Touch Up Inside» при щелкните правой кнопкой мыши на кнопке «Enter». Удаление одного из двух «Отправленных внутри» «Отправленных событий» решило проблему.

Это показало, что проблема вызвана (для класса видео C193P в пошаговом руководстве по калькулятору в задании 1) как 2 отправленных события, одно из которых вызвало исключение.

0 голосов
/ 14 мая 2014

Основы: динамический вызов

Цель C - это динамический язык, который вызывает методы, просматривая во время выполнения методы в классах. Например, если есть Класс A , включая метод DoSomething (arg1, arg2) . Если вы попытаетесь вызвать метод, используя правильные аргументы для объекта класса A , все будет работать нормально. Однако, если аргументы не передаются должным образом, например, вы вызвали метод только с одним аргументом, тогда среда выполнения будет обрабатывать это как вызов метода для другого метода. В конце концов, во время выполнения не удастся найти метод (DoSomething с одним аргументом) и через это исключение "нераспознанный селектор будет отправлен на экземпляр" .

Решение

Пожалуйста, проверьте, какая подпись для @ селектор ожидается. Обычно это так, как вы описали в коде

-(IBAction)numberButtonClick:(id)sender{
0 голосов
/ 06 июня 2018

Мой случай был: collectionView внутри View

Я пытался добавить gestRecognizer в методе config(), который я написал сам. После некоторого обходного пути я обнаружил, что Я просто должен переместить код внутри awakeFromNib().

override func awakeFromNib() {

   //other code

   let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:)))
   self.collectionView.addGestureRecognizer(longPressGesture)
}

И это сработало хорошо.

Я надеюсь, что это может кому-то помочь.

0 голосов
/ 04 декабря 2012

Включая мою долю. Я застрял на этом некоторое время, пока не понял, что создал проект с отключенной ARC (ссылка на автоматический подсчет) . Быстрый выбор ДА для этой опции решил мою проблему.

0 голосов
/ 08 ноября 2013

Произошло со мной из-за противоречивых аргументов ограничения.

0 голосов
/ 18 февраля 2013

Другое возможное решение: добавьте '-ObjC' к своим аргументам компоновщика.

Полное объяснение здесь: Категории Objective-C в статической библиотеке

Я думаю, суть в том, что если категория определена в библиотеке, с которой вы статически связываете, компоновщик не достаточно умен, чтобы ссылаться в методах категорий. Приведенный выше флаг делает ссылку компоновщиком во всех целевых классах и категориях C, а не только в тех, которые он считает необходимыми на основе анализа вашего источника. (Пожалуйста, не стесняйтесь настраивать или исправлять этот ответ. Я знаю, что такое связанные языки, поэтому я просто попугаю здесь).

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