ошибка «нераспознанный селектор отправлен в экземпляр» в 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 ]

1 голос
/ 20 марта 2015

Еще одно немного другое решение / случай.

Я использую Xamarin и MvvmCross, и я пытался привязать UIButton к ViewModel. Я подключил UIB-кнопку к розетке и TouchUpInside.

При привязке я использую только розетку:

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

Все, что мне нужно было сделать, это удалить подключение действия (TouchUpInside) в XCode, и это решило его.

P.S. Я полагаю, что в его основе лежит все, что связано с предыдущими ответами и, в частности, с Крисом Камински, но я надеюсь, что это кому-нибудь поможет ...

Приветствия.

0 голосов
/ 04 ноября 2016

Я получил эту проблему, пытаясь использовать какой-то старый код формата в Swift3 ,

let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respond))

изменение action:"respond:" на действие: #selector(self.respond) исправило проблему для меня.

0 голосов
/ 21 июля 2016

Я тоже получил проблему, и, наконец, я нашел решение для своей проблемы. Я построил controller's UI в раскадровке, но controller's UI не связывал свой контроль с кодом, я используйте этот код для инициализации vc:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Me" bundle:nil];
    [sb instantiateViewControllerWithIdentifier:@"HeaderViewController"];

Этот код выше вызовет проблему, и после того, как я изменил код init на этот ниже, я решил проблему:

HeaderViewController *head_vc = [[HeaderViewController alloc] init];
0 голосов
/ 23 августа 2018

В моем случае:

Определение моего протокола

 @protocol MyProtocol

- (void)Method;

@end

и я забыл, реализует методы делегата.

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

0 голосов
/ 10 марта 2017

У меня было это после переключения со Swift 2 на Swift 3. Приведенное ниже описание является специфическим, но вы можете видеть, что общий случай охватывает множество возможных ошибок.

У меня был метод с именем delete в моем подклассе SKNode.

func delete(thing: SomeType) 

Уже есть метод delete на UIResponder, но мой метод (непреднамеренно) перегрузил его, поэтому он работал нормально. Обновление до Swift 3 изменило его на:

func delete(_ thing: SomeType) 

Все еще работает. Но затем я решил Swift3ify и сделал параметр обязательным:

func delete(thing: SomeType)

, который работал бы нормально, если бы я вспомнил об обновлении вызывающей стороны, но я этого не сделал, теперь вызывающая сторона вызывает метод delete без параметров в UIResponder с неверным типом аргументов.

Это, очевидно, может произойти с любым из длинного списка стандартных методов в SKNode (и, вероятно, UIView), которые принимают Any в качестве аргумента и, таким образом, пройдут фазу компиляции, но затем будут перепадать при вызове .

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

Другая действительно глупая причина этого заключается в том, что селектор определен в интерфейсе (.h), но не в реализации (.m) (т. Е. Опечатка)

0 голосов
/ 10 января 2013

Еще одна причина / решение добавить в список. Это вызвано iOS6.0 (и / или плохим программированием). В более старых версиях селектор совпадал бы, если типы параметров совпадали, но в iOS 6.0 у меня возникали сбои в ранее работающем коде, где имя параметра было неправильным.

Я делал что-то вроде

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

но в определении (и .h, и .m) у меня было

* +1007 *

Это нормально работало на iOS5, но не на 6, даже на одной и той же сборке, развернутой на разных устройствах.

Я не понимаю, почему компилятор не может сказать мне об этом, во всяком случае - проблема подошла.

0 голосов
/ 11 августа 2013

Моя проблема и решение были другими, и я подумал, что я должен опубликовать это здесь, чтобы будущие читатели могли спасти свою голову от удара о стену.

Я выделял разные xib для одного и того же UIVIewController, и даже после поиска везде я не мог найти, как это исправить. Затем я проверил свой AppDelegate, куда я звонил initWithNibName, и вижу, что при копировании кода я изменил имя xib, но забыл изменить класс UIViewController. Поэтому, если ни одно из решений не работает для вас, проверьте метод initWithNibName.

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

Это также может произойти, если вы хотите установить свойство из ControllerA в открытое свойство внутри пользовательского класса ControllerB, и вы еще не установили "Пользовательский класс" внутри инспектора идентификации в раскадровках.

0 голосов
/ 15 ноября 2012

Это может произойти, если вы не назначаете ViewController для ViewControllerScene в InterfaceBuilder. Таким образом, ViewController.m не связан ни с одной сценой.

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