当app已经打开时,Segue没有执行快速操作(Xcode 9)

时间:2017-08-17 06:15:12

标签: ios swift ios11

问题

我想创建一个快速动作(3D Touch),允许用户直接进入游戏的统计部分。我的解决方案基于this教程的代码,并使用此代码。我添加了一些额外的代码,因为我想使用快速操作来执行与教程不同的操作。这是负责执行从初始视图到统计视图的segue的函数。它位于AppDelegate.swift:

来自AppDelegate.swift

func handleQuickAction(shortcutItem: UIApplicationShortcutItem) -> Bool {

    var quickActionHandled = false
    let type = shortcutItem.type.components(separatedBy: ".").last
    if let shortcutType = Shortcut.init(rawValue: type!) {
        switch shortcutType {
        case .statistics:
            quickActionHandled = true

            // I use dispatchQueue to ensure that the segue occurs immediately
            DispatchQueue.main.async {
               self.window?.rootViewController?.performSegue(withIdentifier:     "ARView_to_stats", sender: self.window?.rootViewController)
            }

        }
    }

    return quickActionHandled
}

从以下委托函数调用此函数:

来自AppDelegate.swift

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    completionHandler(handleQuickAction(shortcutItem: shortcutItem))
}

如果应用程序已关闭(从应用程序切换器/多任务处理视图),此设置可完美运行,并点击快速操作。但是,如果我在没有完全关闭应用程序的情况下回家并尝试执行相同操作,则不会转到统计视图,而是转到游戏视图。

我已经尝试了很多次,并且偶尔会崩溃,并发出以下消息:

com.apple.CoreMotion.MotionThread(11):EXC_BAD_ACCESS(code = 1,address = 0x48307beb8)

如何更改此设置以使其按预期工作。

我尝试了什么

  • 删除DispatchQueue.main.async

1 个答案:

答案 0 :(得分:0)

尝试这样的事情

var isQuickLaunched = false
var quickLaunchOption: Shortcut!

func handleQuickAction(shortcutItem: UIApplicationShortcutItem) -> Bool {
    var quickActionHandled = false
    let type = shortcutItem.type.components(separatedBy: ".").last
    if let shortcutType = Shortcut.init(rawValue: type!) {
        isQuickLaunched = true
        quickLaunchOption = shortcutType
        quickActionHandled = true
    }

    return quickActionHandled
}

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    completionHandler(handleQuickAction(shortcutItem: shortcutItem))
}

func applicationDidBecomeActive(application: UIApplication) {
    if (isQuickLaunched == true) {
        isQuickLaunched = false
        switch quickLaunchOption {
        case .statistics:
            DispatchQueue.main.async {
               self.window?.rootViewController?.performSegue(withIdentifier:     "ARView_to_stats", sender: self.window?.rootViewController)
            }
        }
    }
}