нераспознанный селектор отправлен в ошибку экземпляра в Objective-C

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

-[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(@"---");
}

person HelloWorld    schedule 16.03.2010    source источник
comment


Ответы (39)


Похоже, что вы не правильно управляете памятью контроллера представления, и в какой-то момент он освобождается, что приводит к отправке метода numberButtonClicked: другому объекту, который теперь занимает память, которую ранее занимал контроллер представления ...

Убедитесь, что вы правильно сохраняете / освобождаете свой контроллер представления.

person Jasarien    schedule 16.03.2010
comment
Это очень точный диагноз, основанный на нескольких строках кода. - person Michael Morrison; 21.07.2011
comment
Итак, проблема обнаружена ... но убедитесь, что вы правильно сохраняете / освобождаете свой контроллер представления. это предложение, а не решение. - person Alex Gray; 02.09.2011
comment
@alex grey, что? Правильное управление памятью в контроллере представления решило проблему ... Я не понимаю, как это не решение? - person Jasarien; 02.09.2011
comment
Да, этого было достаточно для меня, который тоже только что столкнулся с этой проблемой. - person Jacob Rohde; 21.09.2011
comment
@alexgray может означать, что это недостаточно конкретно или в нем нет примера кода для иллюстрации. Было бы неплохим дополнением. - person Old McStopher; 30.09.2011
comment
правильный. хотя это кажется исправлением ... и я могу быть в меньшинстве (хотя мне все еще удается существовать), но связь между проблемой и решением не сразу очевидна. например, я сталкиваюсь с -[NSWindow end]: unrecognized selector sent to instance 0x100523e80, и хотя я понимаю сходство с OP и даже, возможно, причину проблемы из вашего ответа, реализация исправления не сразу очевидна - person Alex Gray; 04.10.2011
comment
Это сразу видно. Ваше управление памятью NSWindow где-то неправильно. Пройдите его жизненный цикл и исправьте его. - person Jasarien; 04.10.2011
comment
Обязательно ли по этой причине объект в addr не быть экземпляром класса, определяющего селектор? Потому что я испытываю эту ошибку, но когда я po addr, я получаю экземпляр правильного класса, который, по-видимому, должен иметь этот селектор. - person devios1; 08.03.2013
comment
@chaiguy Да, если вы не имеете дело с кластерными классами, возможно. Возможно, вы захотите задать полный вопрос по своей проблеме, поскольку, скорее всего, это что-то другое. - person Jasarien; 08.03.2013
comment
Также следует обратить внимание на то, если у вас изначально была функция частной, но затем вы изменили ее, чтобы она использовалась этим. - person hdost; 20.02.2015

Для тех, кто попадает сюда через Google, как это сделал я, что, вероятно, больше относится к Xcode 4.2 + / iOS 5+, а также к ARC. У меня была такая же ошибка «Неопознанный селектор отправлен в экземпляр». В моем случае у меня было настроено целевое действие UIButton для передачи себя в качестве параметра отправителя, но позже я понял, что он мне не нужен, и удалил это в коде. Итак, что-то вроде:

- (IBAction)buttonPressed:(UIButton *)sender {

Был изменен на:

- (IBAction)buttonPressed {

Щелчок правой кнопкой мыши по рассматриваемому UIButton показал, что событие Touch Up Inside было связано с методом buttonPressed: контроллера представления. Удаление этого и переназначение его модифицированному методу сработало.

person LeonardChallis    schedule 31.01.2012
comment
Это было очень полезно, хотя я думаю, что его собственный вопрос и ответ облегчили бы поиск. - person Curtis Inderwiesche; 29.03.2012
comment
@LeonardChallis Как вы можете ссылаться на отправителя в buttonPressed, если он не передан в качестве параметра? - person zakdances; 04.05.2012
comment
@yourfriendzak Это когда вы не отправляете sender. Я хотел сказать, что если вы решите не отправлять его, но уже настроили метод, именно тогда вы можете столкнуться с этой проблемой. - person LeonardChallis; 04.05.2012
comment
Очень полезный ответ. Я только что столкнулся с этой проблемой, и ваше решение было совершенно правильным. Когда это случилось, я следил за классом Стэнфордского университета по iOS на iTunesU. Еще раз спасибо за ответ! - person Marshall Alsup; 10.07.2012
comment
Очень полезно! Я только что создал несколько представлений с помощью редактора раскадровки (кода еще нет), и я получал эту ошибку при нажатии кнопки. Этот ответ устранил мою проблему - person oli206; 26.07.2012
comment
@MarshallAlsup Я следую тому же руководству, но я не знаю, что изменить свой код, чтобы прочитать этот ответ. Что мне делать, чтобы это исправить (возможно, код)? - person 1.21 gigawatts; 06.03.2013
comment
@MarshallAlsup Я понял это. Мне пришлось щелкнуть правой кнопкой мыши по кнопке и удалить события (нажать x рядом с ними), затем добавить новое действие к этой кнопке и ввести то же имя, что и моя существующая функция (без отправителя), а затем нажать кнопку подключения. Затем удалите повторяющуюся функцию. - person 1.21 gigawatts; 06.03.2013
comment
@LeonardChallis Спасибо. Я добавил комплимент к вашему ответу. - person 1.21 gigawatts; 06.03.2013
comment
Я просто боролся с аналогичной проблемой, удалил параметр отправителя из функции селектора, а затем задумался, как получить отправителя. В моем случае я получал ошибку, потому что я забыл поставить двоеточие после обратного вызова селектора, что привело к несоответствию вызывающей последовательности. С двоеточием я могу сохранить аргумент отправителя. - person ; 21.05.2013
comment
Этот ответ будет работать, если только одна кнопка запускает событие. Подумайте, есть ли 2 или более кнопок, запускающих событие, тогда нам нужно иметь отправителя для идентификации. добавление: в конце селектора решило проблему. - person Isham; 07.02.2014
comment
@isham Что значит конец селектора? Где вы говорите: идет? Мы только что попробовали решение, указанное выше, но теперь наш метод не запускается. Я предполагаю, что это потому, что у нас есть несколько кнопок и вам нужен ваш: для идентификации отправителя ...? - person Praxiteles; 14.06.2015
comment
допустим, у вас есть селектор с именем onButtonClick (UIButton sender) {// ваш код}, и при объявлении селектора вы должны четко указать, что @selector (onButtonClick :) .. здесь внутри скобок: означает, что в селекторе ожидается объект отправителя. если вы забыли: внутри скобки подпись метода не совпадает. Надеюсь это поможет. - person Isham; 15.06.2015
comment
Щелкнув правой кнопкой мыши элемент пользовательского интерфейса, которого я недавно коснулся, я понял, что создал выход, а затем переименовал переменную в ViewController, разорвав соединение. - person Hazen Hills Software; 01.10.2016

Это был главный ответ Google на эту проблему, но у меня была другая причина / результат - я подумал, что добавлю свои два цента на случай, если другие столкнутся с этой проблемой.

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

Так что убедитесь, что ваши действия настроены правильно.

person Chris K    schedule 08.07.2012
comment
Это была моя проблема. Я переименовал функцию и изменил свой код, но не изменил соединение в файле xib. - person BFTrick; 13.09.2012
comment
СПАСИБО! Оказалось, что у меня есть три метода, которые я удалил, и на которые все еще ссылаются. Беспокоит меня уже неделю! - person erdekhayser; 31.05.2013

Хорошо, я должен здесь скинуться. OP динамически создал кнопку. У меня была похожая проблема, и ответ (после нескольких часов охоты) настолько прост, что меня стало тошнить.

Когда используешь:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

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

Варианты кода приемника выглядят так:

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

Как обычно, всегда упускают очевидный ответ.

person Craig H.    schedule 20.05.2013
comment
Огромное спасибо! Это была моя проблема (не поставить двоеточие ":" в конце имени селектора). Почему это почти всегда самые глупые простые вещи, из-за которых мы, гики, бьемся головой о стену в 3 часа ночи? Спасибо большое! - person TWright; 22.09.2013

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

Вот моя функция:

введите описание изображения здесь

Обратите внимание, что он не содержит аргументов.

Вот изображение моей конфигурации кнопки (щелкните правой кнопкой мыши по кнопке, чтобы просмотреть его):

введите описание изображения здесь

Обратите внимание, есть 3 обработчика событий.

Чтобы исправить это, мне пришлось удалить каждый из элементов события, поскольку один из них отправлял ссылку на себя функции enterPressed. Чтобы удалить эти элементы, я щелкал по маленькому значку x рядом с названием каждого элемента до тех пор, пока не исчезли элементы.

введите описание изображения здесь

Затем мне пришлось повторно подключить кнопку к событию. Для этого удерживайте нажатой клавишу Control, а затем перетащите линию от кнопки к действию. Должно быть написано «Действие подключения». Примечание: мне по какой-то причине пришлось перезапустить XCode, чтобы это сработало; в противном случае он позволяет мне вставлять действия (то есть создать новое действие) только над или под функцией.

введите описание изображения здесь

Теперь у вас должен быть единственный обработчик событий, связанный с событием кнопки, которое не передает аргументов:

введите описание изображения здесь

Этот ответ дополняет ответ @Leonard Challis, который вам также следует прочитать.

person 1.21 gigawatts    schedule 05.03.2013

Это также может произойти, если вы не установите «Класс» представления в построителе интерфейса.

person ElCaballeroQueDiceNi    schedule 18.09.2012
comment
Ах, спасибо! Это приводило к сбою моего приложения при переходе, просто забыл установить класс контроллера. - person Eichhörnchen; 04.06.2014
comment
Зачем нужно знать класс? Я пытаюсь использовать UITableViewSection в качестве UIView, поэтому получаю эту ошибку. Компилятор говорит, что UITableViewSection не существует, поэтому я предполагаю, что он является внутренним для UIKit. - person Ian Warburton; 14.12.2016

В моем случае я использовал NSNotificationCenter и пытался использовать селектор, который не принимал аргументов, но добавлял двоеточие. Удаление толстой кишки устранило проблему.

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

См. Ответ Адама Розенфилда здесь: Селекторы в Objective-C?

person Nathan Garabedian    schedule 15.09.2012

У меня была эта проблема с проектом Swift, где я динамически создаю кнопки. Код проблемы:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

Решением было добавить полное двоеточие ':' после действия: например.

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

Полный пример здесь: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

person FredL    schedule 25.07.2014
comment
Сразу после того, как я изучил руководство и прочитал подсказку об этой же проблеме - я попался на нее: D - person user2161301; 31.03.2015

Наиболее очевидной причиной этого (включенной для полноты) является неправильное приведение указателя и вызов метода неправильного класса.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
person devios1    schedule 13.03.2013
comment
Это хороший совет - не создание подкласса для объекта представления или данных (например, из-за невозможности добавить имя подкласса) - это еще один способ, которым это происходит. - person Brad M; 03.12.2013

У меня тоже была такая же проблема.

Я удалил свой uibutton в раскадровке и воссоздал его .. теперь все работает нормально.

person Yohan Dahmani    schedule 11.01.2017

У меня была аналогичная проблема, но для меня решение было немного другим. В моем случае я использовал категорию для расширения существующего класса (UIImage для некоторых возможностей изменения размера - см. Это howto на случай, если вам интересно) и забыл добавить файл * .m в цель сборки. Глупая ошибка, но не всегда очевидная, когда случается где искать. Думал стоит поделиться ...

person Mirko Jahn    schedule 07.11.2012

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

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

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

person Russ Egan    schedule 18.02.2013

Это случилось с моим, потому что я случайно стер "@IBAction func ..." внутри моего кода класса UIViewcontroller, поэтому в раскадровке был создан справочный выход, но во время выполнения была какая-то функция для его обработки.

Решением было удалить ссылку Outlet внутри инспектора свойств, а затем воссоздать ее, перетащив с помощью клавиши command в код класса.

Надеюсь, поможет!

person Guillermo    schedule 14.01.2017
comment
Точно так же это случилось со мной, когда кнопка ссылалась на функцию, которой больше не существовало. - person Josh Wolff; 21.12.2018

Я думаю, вам следует использовать void вместо IBAction в возвращаемом типе. потому что вы определили кнопку программно.

person Fa.Shapouri    schedule 11.09.2012

У меня была такая же ошибка, и я обнаружил следующее:

Когда вы используете код

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

Вы можете подумать, что он ищет селектор:

- (void)yourRefreshMethod{
    (your code here)
}

Но на самом деле он ищет селектор:

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

Этого селектора не существует, поэтому вы получите сбой.

Вы можете изменить селектор на получение (id) отправителя, чтобы устранить ошибку.

Но что, если у вас есть другие функции, которые вызывают функцию обновления без указания отправителя? Вам нужна одна функция, которая работает для обоих. Простое решение - добавить еще одну функцию:

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

Затем измените раскрывающийся код обновления, чтобы вместо этого вызвать этот селектор:

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

Я также прохожу курс Stanford iOS на старом Mac, который нельзя обновить до последней версии Mac OSX. Итак, я все еще работаю над iOS 6.1, и это решило проблему для меня.

person Joseph Pride    schedule 25.01.2014

В моем случае я решил проблему через 2 часа:

Отправитель (элемент tabBar) не имел ссылочного выхода. Так что он никуда не указывал.

Просто создайте справочную точку, соответствующую вашей функции.

Надеюсь, это поможет вам, ребята.

person André DS    schedule 24.08.2018
comment
Чтобы добавить, в моем случае я забыл перенести IBAction на Swift. Итак, он жаловался, что хотел вызвать эту функцию, но ее не удалось найти. - person DevNebulae; 21.01.2020

В настоящее время я изучаю разработку под iOS и просматриваю книгу aPress «Начало разработки под iOS6». Я получал ту же ошибку в главе 10: Раскадровки.

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

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

person Shannon Cole    schedule 28.03.2013

В моем случае я использовал UIWebView и передал NSString во втором параметре вместо NSURL. Поэтому я подозреваю, что неправильные типы классов, переданные функциям, могут вызвать эту ошибку.

person jbaylina    schedule 02.04.2013

.. А теперь мой

У меня была кнопка, связанная с методом, который обращался к параметру другой кнопки, и это отлично работало, НО как только я попытался что-то сделать с самой кнопкой, у меня произошел сбой. При компиляции ошибок не выводилось .. Решение?

Не удалось связать кнопку с владельцем файла. Так что если кто-то здесь такой же глупый, как я, попробуйте это :)

person user2875404    schedule 24.03.2014

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

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

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

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

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

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

Ваше здоровье.

person YKa    schedule 20.03.2015

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

person Harshil.Chokshi    schedule 01.03.2016

Для меня это было оставшееся соединение, созданное в interfacebuilder bij ctrl-drag. Имя разорванного соединения было в журнале ошибок

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

У меня было действие, связанное с кнопкой. Нажатие кнопки привело к сбою приложения, потому что Outlet больше не существует в моем коде. Поиск имени в журнале привел меня к нему в раскадровке. Удалил, а вылет пропал!

person Tom Bevelander    schedule 12.09.2016

Как отладить «отправку нераспознанного селектора в экземпляр»

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

[UITableViewCellContentView image]: unrecognized selector sent to instance

or

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

or

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestApp.MyViewController viewDidLoad:]: unrecognized selector sent to instance 0xDABCDD'

Как найти строку кода, вызывающую это:

Перейдите в навигатор точек останова. Щелкните опцию «+». щелкните «Exception Breakpoint». Появится новый виджет, подобный следующему.

введите описание изображения здесь

Добавьте следующий блок условия:

-[NSObject(NSObject) doesNotRecognizeSelector:]

введите описание изображения здесь

Вы также можете установить точку останова для всех исключений. Теперь снова запустите свой код. на этот раз точка останова сработает при возникновении этого исключения.

НАПИСАН: Прафулла Сингх

Полное объяснение: https://prafullkumar77.medium.com/how-to-debug-unrecognized-selector-send-to-instance-402473bc23d.

person Iker Solozabal Granados    schedule 01.02.2021

Я отвечаю Леонарду Чаллису, так как я также изучал Стэнфордский класс iOS C193P, как и пользователь oli206.

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

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

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

person Peter_from_NYC    schedule 12.10.2012
comment
У меня как-то было 3 записи. :) - person 1.21 gigawatts; 06.03.2013

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

person Vincent    schedule 15.11.2012

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

person caiocpricci2    schedule 03.12.2012

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

person jla    schedule 13.12.2012

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

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

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

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

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

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

В любом случае, я не понимаю, почему компилятор не сказал мне об этом - проблема решена.

person Tim T    schedule 10.01.2013

Это также может произойти, если вы хотите установить свойство из ControllerA в общедоступное свойство внутри настраиваемого класса ControllerB, и вы еще не установили «Custom Class» внутри инспектора идентичности в раскадровках.

person Francisco Gutiérrez    schedule 05.02.2013

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

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

person noob    schedule 10.08.2013

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

person Alex Bedro    schedule 07.11.2013

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

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

Решение

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

-(IBAction)numberButtonClick:(id)sender{
person hadaytullah    schedule 14.05.2014

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

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

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

HeaderViewController *head_vc = [[HeaderViewController alloc] init];
person aircraft    schedule 21.07.2016

У меня возникла эта проблема при попытке использовать старый код формата в Swift3,

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

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

person sabithpocker    schedule 04.11.2016

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

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

func delete(thing: SomeType) 

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

func delete(_ thing: SomeType) 

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

func delete(thing: SomeType)

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

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

person rghome    schedule 10.03.2017

Мой случай был: collectionView внутри представления

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

override func awakeFromNib() {

   //other code

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

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

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

person Federico Arvat    schedule 06.06.2018

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

Мое определение протокола

 @protocol MyProtocol

- (void)Method;

@end

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

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

person liu jeff    schedule 23.08.2018

ОК В СПИСОК! Я ОЧЕНЬ новичок в XCODE, у меня была эта проблема, и я понял ее! Итак, если это похоже на вас, вот ответ:

Когда вы управляете + щелкаете и перетаскиваете кнопку в файл ViewController (чтобы вы могли его закодировать), вам будет предложено заполнить свойства кнопки во всплывающем окне.

Внизу всплывающего окна (под Типом) будет написано ОТПРАВИТЕЛЬ.

ВАМ НЕ НУЖНО НУЖНО ИЗМЕНИТЬ ЕГО

person Akash Bansal    schedule 16.08.2020

В моем случае в iOS 13 мне нужно было только реализовать всю функцию и части вызова селектора, помещенные в основной поток.

person Rakshitha Muranga Rodrigo    schedule 21.08.2020