Программное отклонение UIAlertView на iOS 5 не вызывает метод делегата didDismiss - PullRequest
4 голосов
/ 13 октября 2011

Я сталкиваюсь с проблемой, когда 9 раз из десяти, когда я вызываю dismissWithClickedButtonIndex: animated: из UIAlertView, метод делегата alertView: willDismissWithButtonIndex: не вызывается. Кто-нибудь еще сталкивается с этой проблемой? Я собираюсь сообщить об ошибке в Apple, но мне любопытно узнать, не сталкивался ли кто-нибудь еще с этой проблемой и не нашел ли обходных путей.

Ответы [ 4 ]

9 голосов
/ 04 ноября 2011

Чтобы обеспечить согласованное поведение в iOS4 и 5, вы можете просто удалить делегат UIAlertView непосредственно перед вызовом его dismissWithClickedButtonIndex: animated: , а затем вручную вызвать метод делегата. например,

- (void)somethingDidHappen {
    id<UIAlertViewDelegate> delegate = myAlertView.delegate;
    myAlertView.delegate = nil;
    // now, we know the delegate won't be called...
    [myAlertView dismissWithClickedButtonIndex:0 animated:NO];
    // ...so we call it ourselves below
    [delegate alertView:myAlertView clickedButtonAtIndex:0];
}

(Этот код не проверен, но вы понимаете, в чем дело.)

2 голосов
/ 13 октября 2011

Делегаты объектов пользовательского интерфейса вызываются только тогда, когда пользователь выполняет действие.Apple предполагает, что когда вы делаете что-то из кода, вы уже знаете, что делаете, и вам не нужно быть информированным.Это относится ко всем делегатам (методы прокрутки делегатов UIScrollView или прокрутка кода, манипулирование табличным представлением, ...)Во всяком случае, с каким индексом кнопки должен вызываться делегат? .. нет никого, когда вы отклоняете программно

1 голос
/ 29 апреля 2012

Согласно Почему dismissWithClickedButtonIndex никогда не вызывает clickedButtonAtIndex? Проблема в том, что вызывается другой метод.Однако это не объясняет, почему вы получаете ошибочных вызовов.На устройствах, которые я тестировал, метод dismissil вызывается правильно, поэтому я перенаправляю его только на версию click.

Возможно, вам следует сообщить об ошибке в Apple, если вы продолжаете видеть ошибочное поведение.

0 голосов
/ 28 марта 2014

Есть alertView:clickedButtonAtIndex:, alertView:didDismissWithButtonIndex: и alertView:willDismissWithButtonIndex:. Метод, на который вы ссылаетесь (clickedButtonAtIndex:), вызывается только тогда, когда пользователь явно нажимает на кнопку в окне просмотра предупреждений (следовательно, «нажал»).

Программные вызовы через dismissWithClickedButtonIndex:animated: для отмены предупреждения, похоже, не вызывают alertView:clickedButtonAtIndex:.

Таким образом, если вам нужно, чтобы какое-то поведение всегда вызывалось при закрытии представления оповещения - независимо от того, было ли оно запущено пользователем при нажатии на кнопку или запущено программно - тогда использование didDismissWithButtonIndex: и willDismissWithButtonIndex: имеет больше смысла .

...