【问题标题】:Dialog box displayed by EKEventStore.authorizationStatus(for:) apparently hidden behind overlayEKEventStore.authorizationStatus(for:) 显示的对话框显然隐藏在覆盖层后面
【发布时间】:2016-10-05 08:44:54
【问题描述】:

我的应用程序的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:)

此时,应用程序似乎停止运行,只有覆盖层可见。当我停止应用程序时,会出现询问是否应允许应用程序访问日历的对话框。它显然隐藏在叠加层之下。

如何确保对话框出现在屏幕的最前面,以便用户有机会回答其实际问题?

更新以下是有关一般上下文的更多信息以回答问题:应用程序委托中的代码的原因是——除非它发生在以前的启动中——我需要提示用户输入服务器凭据,从服务器获取数据并将其中一些数据存储在EKEvents 中。覆盖层支持显示视图控制器以获取用户的凭据(请参阅here)。当从服务器接收到数据时,覆盖将被删除。调用makeKeyAndVisible 是必要的,以便UIApplication.shared.keyWindow 在应用程序生命周期的早期阶段获得价值。该值是呈现所述视图控制器以获取凭据所必需的。

【问题讨论】:

  • 您确定在 LaunchScreen 故事板中有这个选项卡视图控制器吗?它通常只包含启动屏幕(顾名思义),其余的将在主故事板中...您是否尝试在视图控制器中设置断点以查看它是否到达那里?
  • @kender 不,标签视图控制器不在 LaunchScreen 故事板中,而是在 Main.storyboard 中(参见编辑)。
  • 那么您的 AppDelegate 中的代码的原因是什么?您是否随时删除叠加层?如果不让覆盖窗口生成KeyAndVisible 怎么办?
  • @kender 我更新了 Q 以回答您提出的问题。 (所有这些都一直有效,所以一般的方法可能是合理的。)

标签: ios overlay ios10 eventkit


【解决方案1】:

问题不在于对话框隐藏在覆盖层后面,而是我在application(_:didFinishLaunchingWithOptions:launchOptions:) 内同步调用了EKEventStorerequestAccess(to:completion:)(通过在调用完成处理程序内发出信号后等待) .因此整个应用程序停滞不前,甚至没有显示对话框。

解决方案在于异步请求访问。以下方案目前已经足够好:

  • 如果(尚未)授予对 EKCalendar 的访问权限,则实例变量 calendarEventnil
  • requestAccess(to:completion:) 从内部调用 application(_:didFinishLaunchingWithOptions:launchOptions:)
  • calendarEventrequestAccess(to:completion:) 的完成处理程序中设置为此 EKCalendar
  • 在读取或写入日历应用程序之前检查calendarEvent != nil
  • 在调用application(_:didFinishLaunchingWithOptions:launchOptions:) calendarEvent 的run loop 循环中保持nil;应用的行为就像日历是空的一样
  • 在运行循环的后续循环中calendarEvent 已设置;应用实际上只在后面的周期中写入日历

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2018-03-05
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多