Метод делегата "clickedButtonAtIndex:" не вызывается - PullRequest
6 голосов
/ 29 марта 2010

Я создал вид предупреждения с двумя кнопками, используя следующий код:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: title 
message: msg delegate:nil cancelButtonTitle:@"Replay" otherButtonTitles:@"Highscore", nil];
[alertView show];

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

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
 if (buttonIndex==0) //Run some code 
 else //Other code
 }

Но этот метод не вызывается, когда я нажимаю любую из кнопок! Может кто-нибудь сказать мне, почему?

Заранее спасибо,

Sagiftw

Ответы [ 5 ]

39 голосов
/ 29 марта 2010
delegate:nil

как представление предупреждений ассоциирует делегата, если вы указали, что делегатов не будет? Замените эту часть на

delegate:self

вместо.

3 голосов
/ 29 марта 2010

Попробуйте установить для делегата self вместо nil.

2 голосов
/ 15 июля 2014

Я вызывал UIAlertView dismissWithClickedButtonIndex: animated: метод из метода делегата UITextField, потому что я также хотел обработать клавишу возврата клавиатуры:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if (textField.tag == 1001) {
        [textField resignFirstResponder];
        [_alert dismissWithClickedButtonIndex:1 animated:YES];
    }
    return YES;
}

Таким образом, метод alertView: clickedButtonAtIndex: никогда не вызывается, даже если вы настроили правильный делегат. Вместо этого alertView: didDismissWithButtonIndex: действительно вызывается. Поэтому вместо этого реализуйте этот метод:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    // your code here
}

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

0 голосов
/ 17 ноября 2015

Правильный ответ на этот вопрос delegate:nil. Но в случае, если делегат уже настроен на себя, а clickedButtonAtIndex по-прежнему не работает, попробуйте проверить, не высовываете ли вы другой контроллер представления ([self.navigationController popViewControllerAnimated:YES];) после показа alertview. Это также может привести к тому, что clickedButtonAtIndex не будет вызван. Это то, что случилось со мной.

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

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

в .h положить UIActionSheetDelegate и в .m при создании alertView выставить делегата к себе, а не к нулю, как это было сделано в вышеуказанном случае

...