2016-10-05 2 views
-1

Моя приложения application(_:didFinishLaunchingWithOptions:launchOptions:) является создание overlay вроде этого:диалоговое окно отображается EKEventStore.authorizationStatus (для :), видимо, скрывается за накладкой

window.makeKeyAndVisible() 
let launchStoryboard = UIStoryboard(name: "LaunchScreen", bundle: nil) 
let overlayView = launchStoryboard.instantiateInitialViewController()!.view! 
window.addSubview(overlayView) 

первоначальный контроллер представления о приложении, как это определено в Main.storyboard является чья первая вкладка UITabBarController содержит UINavigationController. viewDidLoad() его контроллера корневого вида вызывает EKEventStore.authorizationStatus(for:).

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

Как я могу убедиться, что диалоговое окно появляется в самой передней части экрана, чтобы пользователь получил возможность ответить на его фактический вопрос?

ОБНОВЛЕНИЕ Подробнее об общем контексте в ответ на вопросы: Причина для кода в делегате приложения заключается в том, что - если только это не произошло при предыдущем запуске - мне нужно запросить пользователя учетные данные сервера, получить данные с сервера и сохранить некоторые из этих данных в EKEvent с. Оверлейные опоры, представляющие контроллер вида для получения учетных данных пользователя (см. here). Оверлей будет удален, когда данные будут получены с сервера. Вызов makeKeyAndVisible необходим для получения UIApplication.shared.keyWindow, чтобы получить стоимость, несмотря на ранний этап жизненного цикла приложения. Это значение требуется для представления указанного контроллера просмотра для получения учетных данных.

+0

У вас есть этот контроллер представления таблиц в раскадровке LaunchScreen? Обычно он содержит только экран запуска (как следует из названия), а остальное будет в главной раскадровке ... Также вы пытались установить контрольную точку в своем контроллере просмотра, чтобы увидеть, даже если она туда попала? – kender

+0

@kender Нет, контроллер представления вкладок не находится в раскадровке LaunchScreen, но в Main.storyboard (см. Править). – Drux

+0

Какова причина для кода в вашем AppDelegate? Вы удаляете оверлей в любой точке? А что, если вы не сделаетеKeyAndVisible оверлейным окном? – kender

ответ

0

Проблема заключалась не в том, что диалоговое окно было скрыто за накладкой, но что я назвал EKEventStore «s requestAccess(to:completion:) синхронно (подождав после вызова для семафора, который сигнализировал внутри обработчика завершения) внутри application(_:didFinishLaunchingWithOptions:launchOptions:). Следовательно, все приложение застопорилось, и диалоговое окно даже не отображалось.

Решение состояло в асинхронном запросе доступа. Следующая схема в настоящее время достаточно хорошо:

  • экземпляр переменной calendarEvent является nil, если доступ к EKCalendar не было (пока) предоставляется
  • requestAccess(to:completion:) вызывается внутри application(_:didFinishLaunchingWithOptions:launchOptions:)
  • calendarEvent установлен в этом EKCalendar в завершении обработчик requestAccess(to:completion:)
  • перед чтением или письмом в приложение для проверки календаря, если calendarEvent != nil
  • во время цикл цикла запуска с вызовом application(_:didFinishLaunchingWithOptions:launchOptions:)calendarEvent остается nil; приложение ведет себя так, как будто календарь пуст
  • в течение последующих циклов цикла цикла calendarEvent был установлен; приложение фактически записывает в календарь только в течение этих более поздних циклов.
Смежные вопросы