Нажатие кнопки UIB приводит к ошибке нераспознанного селектора - PullRequest
1 голос
/ 02 сентября 2011

У меня есть кнопка в моем UIView, которая создается следующим образом:

UIBarButtonItem *editButton = 
        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit 
                                                      target:self       
                                                      action:@selector(toggleEdit)];
self.navigationItem.rightBarButtonItem = editButton;
[editButton release];

И это метод действия:

-(void) toggleEdit:(id)sender
{
}

, но я получаю эту ошибку

2011-09-02 15: 27: 13.362 blubb [15006: 207] - [DatabaseSelectionViewController toggleEdit]: нераспознанный селектор отправлен в экземпляр 0x5a29d80 2011-09-02 15: 27: 13.365 blubb [15006: 207] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [DatabaseSelectionViewController toggleEdit]: нераспознанный селектор, отправленный экземпляру 0x5a29d80'

Почему это происходит?

Ответы [ 7 ]

7 голосов
/ 02 сентября 2011

Правильное имя для вашего селектора:

@selector(toggleEdit:)

Без : он будет искать метод с такой подписью:

-(void) toggleEdit  // No parameters
{
}

Когда вы на самом делеобъявили:

-(void) toggleEdit:(id)sender
{
}
5 голосов
/ 02 сентября 2011

Изменить

@selector(toggleEdit)

на

@selector(toggleEdit:)
2 голосов
/ 02 сентября 2011

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

1 голос
/ 03 ноября 2011

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

@selector(toggleEdit:)

См. Раздел Синтаксис сообщения языка программирования Objective-C:

Имя селектора включает все части имени, включая двоеточия, поэтому селектор в предыдущем примере называется setOriginX:y:. У него два двоеточия, потому что он принимает два параметра. Однако имя селектора не включает ничего другого, например, тип возвращаемого значения или типы параметров.

1 голос
/ 02 сентября 2011

Попробуйте:

UIBarButtonItem *editButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
target:self action:@selector(toggleEdit) forControlEvents:UIControlEventTouchUpInside];
1 голос
/ 02 сентября 2011

должно быть:

-(IBAction) toggleEdit:(id)sender {}

и

@selector(toggleEdit:)
0 голосов
/ 29 июля 2012

Если вы используете раскадровку.Иногда помогает удалить кнопку из раскадровки, вставить новую кнопку и выполнить необходимые подключения.

...