我的应用application(_:didFinishLaunchingWithOptions:launchOptions:)
正在创建overlay这样的内容:
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 :(得分:0)
问题不在于对话框隐藏在叠加层后面,而是我同步调用EKEventStore
的{{1}}(通过在完成处理程序内发出信号的调用后等待)在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
; app的行为就像日历是空的一样nil
的后续循环期间已设置;应用程序实际上只在后续周期中写入日历