У меня проблема с UIAlertController. Он не может получать какие-либо события касания и быть уволен. Я persent предупреждения таким образом:UIAlertController в iOS 8.x не может реагировать на событие прикосновения, является ли событие касания отправлено объекту ключевого окна?
UIViewController *controller =[UIApplication sharedApplication].keyWindow.rootViewController
[controller presentViewController:alertController animated:YES completion:nil];
По истечению этого времени, предупреждение вида был presented.But, когда я пытаюсь нажать «OK», нет никакого ответа. Поэтому я нажимаю пустую область вокруг окна предупреждения, кнопка на нижнем уровне получает ее и делает ответ.
В моем приложении есть сторонний SDK, который предоставляет кнопку приостановки и пользовательский интерфейс входа/выхода. Кнопка всегда будет там, но пользовательский интерфейс не будет представлен, кроме как я его вызываю. SDK добавит два окна в оконный массив приложения, когда он был инициализирован. Итак, есть три объекта в '[UIApplication sharedApplication] .windows'. выглядеть следующим образом:
[0]:”<TS_PlatformWindow: 0x16e15ac0; baseClass = UIWindow; frame = (0 0; 568 320); gestureRecognizers = <NSArray: 0x186a85b0>; layer = <UIWindowLayer: 0x186a8a20>>",
[1]:”<UIWindow: 0x16e1a060; frame = (0 0; 568 320); autoresize = W+H; tag = 10000000; gestureRecognizers = <NSArray: 0x16e19af0>; layer = <UIWindowLayer: 0x16e19f40>>",
[2]:“<UITextEffectsWindow: 0x16f576c0; frame = (0 0; 568 320); opaque = NO; gestureRecognizers = <NSArray: 0x16f57120>; layer = <UIWindowLayer: 0x16f574b0>>"
окно моего приложения с индексом 1, окна с индексом 0 и 2 являются третьей стороной SDK,.
В качестве официального документа в библиотеке разработчиков iOS приведена цитата: «Событие перемещается по определенному пути до тех пор, пока оно не будет доставлено объекту, который может его обработать. Во-первых, однотонный объект UIApplication принимает событие от вершины очереди и отправляет его для обработки. Обычно он отправляет событие в объект окна ключа приложения, который передает событие в исходный объект для обработки. Исходный объект зависит от типа события. ' от https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html
Как я понимаю, сенсорные события следует отправлять в ключевое окно приложения, но на самом деле в окне моего приложения нет. В документе используется слово «Как правило», поэтому я не уверен, что ситуация в моем приложении является исключением. Нет никакого упоминания о том, как событие было достигнуто, если есть многократные окна.
Так что я изменить свой код так:
UIViewController *controller =[UIApplication sharedApplication].keyWindow.rootViewController
for (UIWindow *win in wins.reverseObjectEnumerator) {
UIViewController *rootController = win.rootViewController;
if (rootController != nil) {
controller = rootController;
break;
}
}
[controller presentViewController:alertController animated:YES completion:nil];
Значение по умолчанию «» контроллера будет назначен «keyWindow.rootViewController» путешествия массив окна приложения в обратном порядке, и выберите «rootViewController» самого верхнего объекта для представления предупреждения. Он работает!
Эта проблема путает меня, если это правильное решение? Или есть другой документ может дать объяснение
PS:
Каждые операции на главном потоке