Программно отклонить UIActionSheet в iOS 8 закручивает окна UIApplication / keyWindow

История:

Мне нужно программно отклонить UIActionSheet, когда приложение переходит в фоновый режим, и то, что я сделал в iOS 7, - это пройти [UIApplication sharedApplication].windows и найти представление типа UIActionSheet, а затем закрыть его. Не работает в iOS 8.

Фон:

В iOS 8 UIAlertController следует использовать для отображения списка предупреждений или действий, а небольшой эксперимент показывает, что UIActionSheet внутренне реализован с использованием UIAlertController:

po [[UIApplication sharedApplication] keyWindow] <_UIAlertControllerShimPresenterWindow:

po [[[UIApplication sharedApplication] keyWindow] rootViewController] <_UIAlertShimPresentingViewController: 0x7faa0cf049f0>

po [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] <UIAlertController: 0x7faa0c8cb9e0>

У которого правильный заголовок, сообщение и т. Д.

Путаница:

Затем я добавил код, чтобы закрыть контроллер, и он его закрывает. Однако теперь приложение не реагирует на действия пользователя, и я обнаружил, что после закрытия keyWindow по-прежнему _UIAlertControllerShimPresenterWindow, тогда я запутался, не следует ли отклонение представленного контроллера очищать его окно? Или это потому, что оно закрывается только тогда, когда приложение переходит в фоновый режим, поэтому иерархия окон не находится в нормальном состоянии, поэтому все идет наперекосяк?

Кто-нибудь может высказать свое мнение?

Спасибо!


person hzxu    schedule 30.10.2014    source источник
comment
Почему бы вам не использовать dismissViewController в UIAlertController?   -  person sha    schedule 30.10.2014
comment
Спасибо @sha Я пробовал это, но это не сработало.   -  person hzxu    schedule 30.10.2014
comment
Если это не сработало, происходит что-то еще странное.   -  person Jamie Forrest    schedule 12.01.2015


Ответы (1)


Сначала я был озадачен этим. Из контроллера представления, из которого я представляю после отклонения actionSheet, я назвал это, предполагая, что это решит эту проблему:

[self.view.window makeKeyAndVisible];

Полностью не сработало. ShimPresenterWindow по-прежнему остается главным окном.

Так что я придумал другую идею. Как только вы закроете alertController, вставьте следующий код:

NSString *windowDescription = NSStringFromClass([window class]);
        if ([windowDescription isEqualToString:@"_UIAlertControllerShimPresenterWindow"]){
            window.hidden = YES;
        }

Это в сочетании с тем, что главное окно становится видимым, успешно убирает лист действий с главного окна. Обратите внимание, что я не уверен, приводит ли это к каким-либо утечкам памяти.

person Matthew Peterson    schedule 12.01.2015