Предотвратить отображение всплывающих окон поверх представленных представлений

Я пытаюсь отобразить экран кода доступа, который появляется после X бездействия. Я использую presentViewController:animated:completion: на корневом контроллере представления, и он работает, как и ожидалось, за исключением случаев, когда всплывающее окно уже отображается. Всплывающее окно, отображаемое из элемента кнопки панели, появляется поверх представленного экрана кода доступа.

Есть ли способ отклонить или скрыть все видимые всплывающие окна при представлении контроллера представления?


person livings124    schedule 05.06.2013    source источник


Ответы (3)


Создайте и добавьте второе окно поверх первого. Представьте экран кода доступа во 2-м окне. Это позволит ему появляться поверх любого и всех представлений из первого окна. Когда вы закроете экран с паролем, обязательно удалите новое окно и снова нажмите 1-ю клавишу.

person rmaddy    schedule 05.06.2013
comment
Как добавить это окно? Свойство Windows в UIApplication выглядит доступным только для чтения. - person livings124; 05.06.2013
comment
Похоже, makeKeyAndVisible делает это автоматически. Кажется, это работает - единственная проблема заключается в том, что кнопки в контроллере представления, который я установил как rootViewController, не реагируют на прикосновение (и я явно установил enableUserInteraction). - person livings124; 05.06.2013
comment
Решена проблема с реакцией на прикосновение путем явной установки размера окна. Спасибо! - person livings124; 06.06.2013

У вас есть ссылка на поповер? Тогда вы можете просто позвонить

[popover dismissPopoverAnimated:NO];

когда вы идете в магазин наложение кода доступа.

ИЗМЕНИТЬ

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

for (UIView* view in self.view.subviews) {
    if([view respondsToSelector:@selector(dismissPopoverAnimated:)]){
        [(UIPopoverController*)view dismissPopoverAnimated:NO];
    }
}
person Josh    schedule 05.06.2013
comment
Я надеялся сделать это более общим. Есть много потенциальных представлений с множеством несвязанных всплывающих окон. - person livings124; 05.06.2013
comment
Есть очень неприятный способ сделать это, перебирая все подпредставления и проверяя, отвечает ли оно на команду rejectPopoverAnimated:. См. редактирование. - person Josh; 05.06.2013
comment
Я подумал, что это способ. Я просмотрел цикл через дочерние контроллеры представления контроллеров представления, пока не нашел UIPopoverController - кажется, что контроллер всплывающего окна имеет родительский контроллер представления, но тот же контроллер представления не имеет UIPopoverController в качестве дочернего контроллера представления. Любая идея, почему это было бы? - person livings124; 05.06.2013
comment
Я не совсем уверен, я предполагаю, что дочерние контроллеры представления связаны с сдерживанием контроллера представления (думаю, панели вкладок), тогда как родительские контроллеры представления как-то отличаются. Извините, я больше не могу быть полезным. - person Josh; 06.06.2013

NSNotifications — хороший инструмент для решения этой проблемы. Пусть все ваши представления или контроллеры, представляющие всплывающие окна, прослушивают уведомление с именем, скажем, WillPresentPasscodeScreen, и реализуют метод, который закрывает всплывающее окно при поступлении уведомления. Затем, прежде чем вы предоставите свой код доступа VC, опубликуйте уведомление WillPresentPasscodeScreen — не более того. всплывающие окна, независимо от того, где вы находитесь в приложении.

person Joe Hankin    schedule 05.06.2013