Обработчик UIAlertAction не вызывается в UIWindows на iOS 9

Я пытаюсь использовать выделенный UIWindow для представления UIAlertControllers. Все шло довольно хорошо, пока я не понял, что обработчики на UIAlertActions, прикрепленные к UIAlertControllers, не срабатывали, если они были представлены контроллером на этом другом UIWindow.

Если я представляю UIAlertController из любого viewController в главном окне, обработчики запускаются, если я представляю его из rootViewController окна предупреждения, обработчики не запускаются.

Любые намеки на то, что я могу испытывать здесь? Спасибо!

Изменить: Тестовый проект, иллюстрирующий проблему.

Решено: я забыл вызвать блок завершения в моем переопределении dismissViewControllerAnimated:completion: в моем подклассе alertWindowRootViewController.


person rzulkoski    schedule 07.10.2015    source источник
comment
Правильно ли ведет себя контроллер предупреждений? Я имею в виду, он закрывается при нажатии кнопки? Обновите свой вопрос соответствующим кодом.   -  person rmaddy    schedule 08.10.2015
comment
@rmaddy Кажется, в остальном он ведет себя нормально. Он отключается при нажатии кнопок. Однако без обработчиков это довольно бесполезно. Вот созданный мной тестовый проект, иллюстрирующий проблему.   -  person rzulkoski    schedule 08.10.2015


Ответы (2)


Я не могу представить, почему ты когда-либо хотел это сделать. Но я предполагаю, что Apple оптимизирует некоторые действия в окнах, которые не являются ключевым окном.

Каким бы ни был короткий ответ, вы не должны этого делать.

person InkGolem    schedule 07.10.2015
comment
На самом деле, согласно этому ответу, именно так Apple фактически реализует внутреннее отображение своих UIAlertControllers. Также это метод, который Дилан Беттерманн использовал успех. - person rzulkoski; 08.10.2015
comment
@rzulkoski, если я не ошибаюсь, этот метод заканчивался на UIAlertController. Раньше с UIAlertView это был единственный способ гарантировать, что он будет на высоте, но с контроллерами презентаций Apple смогла добиться более согласованного поведения. - person InkGolem; 08.10.2015
comment
Я не думаю, что кто-то может быть уверен за пределами Apple, но впечатление, которое я получил от ответа, который я дал в своем комментарии выше, заставило меня думать иначе. В ответе он заявляет, что на WWDC 2015 инженер Apple сказал ему, что внутри Apple создает UIWindow с прозрачным UIViewController, а затем представляет на нем UIAlertController. В любом случае, теперь, когда я нашел и исправил свою ошибку, она работает довольно хорошо. /ваше здоровье - person rzulkoski; 08.10.2015

Так что получается, что я забыл вызвать блок завершения в своем переопределении dismissViewControllerAnimated:completion. Дох!

Я обновил свой тестовый проект, включив в него исправление в надежде, что оно может оказаться полезным для кого-то еще.

Мне нравится мое решение больше, чем Решение Дилана Беттермана, так как у меня есть постоянное окно, которое не связано с жизненный цикл UIAlertController. Это означает, что вам разрешено сохранять надежные указатели на контроллеры предупреждений, в отличие от решения Дилана.

person rzulkoski    schedule 08.10.2015