2015-04-07 10 views
1

У меня проблема с 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:

Каждые операции на главном потоке

ответ

0

Я не могу получить доступ к фоновому виду из UIAlertController, поэтому используя addGestureRecognizer для текущего keyWindow -

?
class MyAlertController: UIAlertController, UIGestureRecognizerDelegate { 

var tapGesture : UITapGestureRecognizer? 

override func viewDidAppear(animated: Bool) 
{ 
    tapGesture = UITapGestureRecognizer(target: self, action:Selector("tapGesture:")) 
    tapGesture!.delegate = self 
    UIApplication.sharedApplication().keyWindow?.addGestureRecognizer(tapGesture!) 
} 

func tapGesture(sender: UITapGestureRecognizer? = nil) 
{ 
    UIApplication.sharedApplication().keyWindow?.removeGestureRecognizer(tapGesture!) 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 
}