- (void)alertViewCancel:(UIAlertView *)alertView не вызывается
-
20-09-2019 - |
Вопрос
У меня проблема: метод UIAlertViewDelegate - (void)alertViewCancel:(UIAlertView *)alertView не вызывается, когда я отменяю AlertView с помощью кнопки отмены.
Странно то, что метод делегата - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex работает отлично.
Есть ли у кого-нибудь идеи?
заранее спасибо
Шон
- (void)alertViewCancel:(UIAlertView *)alertView
{
if(![self aBooleanMethod])
{
exit(0);
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
//some code
}
Я вызываю это при нажатии кнопки:
- (void)ImagePickDone
{
UIAlertView *alertDone = [[UIAlertView alloc]
initWithTitle:@"Done"
message:@"Are u sure?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles: @"Yes", nil];
[alertDone show];
[alertDone release];
}
Решение
alertViewCancel используется, когда система закрывает просмотр вашего оповещения, а не когда пользователь нажимает кнопку «Отмена».Цитата из Apple, документы:
Опционально, вы можете реализовать alertViewCancel:метод, чтобы принять соответствующие действия, когда система отменяет просмотр оповещений.Если делегат не реализует это метод, поведение по умолчанию: имитировать нажатие пользователем отмены кнопка и закрытие представления.
Если вы хотите фиксировать, когда пользователь нажимает кнопку «Отмена», вам следует использовать метод clickedButtonAtIndex и проверить, соответствует ли индекс индексу кнопки отмены.Чтобы получить этот индекс, используйте:
index = alertDone.cancelButtonIndex;
Другие советы
Вы можете обработать Cancel по индексу 0 этого делегата:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0){
//cancel button clicked. Do something here.
}
else{
//other button indexes clicked
}
}
Это можно улучшить двумя способами.Во-первых, он обрабатывает только тот случай, когда пользователь действительно нажал кнопку.Он не обрабатывает ситуацию, когда вызывается [myAlert DisclaimWithClickedButtonIndex:] или что предупреждение отклоняется каким-либо другим способом.Во-вторых, кнопка 0 не обязательно является кнопкой отмены.В оповещении с двумя кнопками левая имеет индекс 0, а правая — индекс 1.Если вы изменили заголовки так, что на правой кнопке написано «Отмена», то кнопка 1 логически является кнопкой «Отмена».Вместо «willDismiss» вы можете реализовать «didDismiss», который будет вызываться после исчезновения диалога, а не раньше.
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex == alertView.cancelButtonIndex)
{
//cancel button clicked. Do something here.
}
else
{
//other button indexes clicked
}
}