Неизвестный селектор отправлен в сообщение об ошибке экземпляра из UIButton

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

    UIButton *alertButton = [UIButton buttonWithType:UIButtonTypeInfoDark];     
    [alertButton addTarget:self.tableView action:@selector(showAlert:) 
          forControlEvents:UIControlEventTouchUpInside];
    alertButton.frame = CGRectMake(220.0, 20.0, 160.0, 40.0);

    [self.tableView addSubview:alertButton];

и вот метод оповещения, который я хочу активировать при касании InfoDark UIButton:

- (void) showAlert {
        UIAlertView *alert = 
         [[UIAlertView alloc] initWithTitle:@"My App" 
                                    message: @"Welcome to ******. \n\nSome Message........" 
                                   delegate:nil 
                          cancelButtonTitle:@"Dismiss" 
                          otherButtonTitles:nil];
        [alert show];
        [alert release];
}

спасибо за любую помощь.


person hanumanDev    schedule 17.05.2011    source источник


Ответы (3)


Хорошо, у вас есть две проблемы. одна из них - проблема с селектором, как указано выше, но ваша настоящая проблема:

[alertButton addTarget:self.tableView 
                action:@selector(showAlert:) 
      forControlEvents:UIControlEventTouchUpInside];

Это неправильная цель, если вы не создали подкласс UITableView для ответа на предупреждение.

вы хотите изменить этот код на:

[alertButton addTarget:self 
                action:@selector(showAlert) 
      forControlEvents:UIControlEventTouchUpInside];
person Grady Player    schedule 17.05.2011

Причина сбоя: ваш showAlert прототип функции должен быть - (void) showAlert:(id) sender.

Используйте приведенный ниже код

- (void) showAlert:(id) sender {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"My App" message: @"Welcome to ******. \n\nSome Message........" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
        [alert show];
        [alert release];
}

Как говорит Джейкоб Релкин в своем ответе здесь :

Поскольку вы включили двоеточие (:) в аргумент селектора для addTarget, принимающий селектор должен принимать параметр. Среда выполнения не распознает селектор @selector(buttonTouched:), потому что нет метода с таким именем, который принимает параметр. Измените сигнатуру метода, чтобы принять параметр типа id, чтобы решить эту проблему.

person Jhaliya - Praveen Sharma    schedule 17.05.2011
comment
Я изменил метод showAlert на showAlert:(id)sender. действие: @selector(showAlert:) вообще меняется? Спасибо - person hanumanDev; 17.05.2011
comment
@hanumanDev: измените только на showAlert: (id) отправитель, пусть ваше действие будет в методе как оно (не изменяйте действие: @ selector (showAlert:)). - person Jhaliya - Praveen Sharma; 17.05.2011
comment
Я сделал это, только изменив отправителя showAlert: (id) (как в файлах .h, так и в .m), но он все равно вылетает. - person hanumanDev; 17.05.2011
comment
Вместо этого я сделал это в IB и изменил метод на IBAction, и он работает. Я не мог видеть, в чем была моя ошибка. спасибо за вашу помощь. - person hanumanDev; 17.05.2011

Джалия права, но вот краткое объяснение почему.

Когда вы настроили цель кнопки, вы определили селектор следующим образом:

@selector( showAlert: )

Двоеточие (:) устанавливает сигнатуру метода для селектора, требующего один аргумент. Однако ваш метод был определен как -showAlert без аргументов, поэтому ваш объект фактически не реализовывал метод, который вы указали для вызова UIButton. Переопределение вашего метода, как показано Jhaliya, будет работать, как и изменение селектора цели вашей кнопки на:

@selector( showAlert )
person more tension    schedule 17.05.2011
comment
Спасибо за ваше объяснение. Я попробовал @selector(showAlert), и он все равно вылетает с ошибкой нераспознанного селектора. Должно быть, я делаю что-то еще неправильно, возможно. - person hanumanDev; 17.05.2011