3D Touch快速操作预览视图控制器仅出现一次

3

我有以下问题。当我在手机上运行我的应用程序时,按压3D Touch图标并选择快捷操作会启动应用程序并显示正确的视图控制器,但是当我将应用程序置于后台并尝试调用快捷操作时,它只会打开我离开的应用程序。因此,为了使其正常工作,我必须每次都杀死我的应用程序。 这是我的代码:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if shortcutItem.type == "com.traning.Search" {

        let sb = UIStoryboard(name: "Main", bundle: nil)

        let searchVC = sb.instantiateViewControllerWithIdentifier("searchVC") as! UINavigationController

        let root = UIApplication.sharedApplication().keyWindow?.rootViewController
        root?.presentViewController(searchVC, animated: false, completion: { () -> Void in
            completionHandler(true)
        })

    }
}

感谢您事先的支持。

1
它调用performActionForShortcutItem吗?root = nil吗? - beyowulf
1
我是说尝试在performActionForShortcutItem中打印一些内容,以确保它被调用了。也许可以打印出root,这样就可以检查performActionForShortcutItem是否被调用,并检查确保root不为nil。 - beyowulf
问题在于应用启动后仅调用一次该方法,随后如果我将其置于后台,并尝试调用该方法,则不会发生任何事情。 - martin petrov
1
你确定它没有被调用吗?还是可能被调用但没有执行任何操作?按照我的建议去做可以帮助我们确定是哪种情况。你这样做了吗?结果是什么? - beyowulf
让我们在聊天中继续这个讨论 - martin petrov
显示剩余3条评论
1个回答

4
我猜你是想从一个不可见的视图控制器中呈现一个视图控制器。你可以使用扩展,例如:
    extension UIViewController {
    func topMostViewController() -> UIViewController {
        if self.presentedViewController == nil {
            return self
        }
        if let navigation = self.presentedViewController as? UINavigationController {
            return navigation.visibleViewController.topMostViewController()
        }
        if let tab = self.presentedViewController as? UITabBarController {
            if let selectedTab = tab.selectedViewController {
                return selectedTab.topMostViewController()
            }
            return tab.topMostViewController()
        }
        return self.presentedViewController!.topMostViewController()
    }
}

extension UIApplication {
    func topMostViewController() -> UIViewController? {
        return self.keyWindow?.rootViewController?.topMostViewController()
    }
}

您可以将这两个代码放在您的AppDelegate.swift文件中,放在您的AppDelegate类上面,以获取当前可见的视图控制器。enter image description here 然后在其上呈现搜索视图控制器。例如:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if shortcutItem.type == "com.traning.Search" {

        let sb = UIStoryboard(name: "Main", bundle: nil)

        let searchVC = sb.instantiateViewControllerWithIdentifier("searchVC") as! UINavigationController

        let topViewController = UIApplication.sharedApplication.topMostViewController()
        topViewController.presentViewController(searchVC, animated: false, completion: { () -> Void in
            completionHandler(true)
        })

    }
}

谢谢,但我仍然不明白在哪里放置该函数以及在哪里调用它。 - martin petrov
1
抱歉,我漏掉了一些东西。 - beyowulf
它在这一行报错:extension UIViewController { 声明仅在文件范围内有效。 - martin petrov
1
你是否像我添加的屏幕截图中那样复制了它? - beyowulf
我想要10个账户并给这个答案点赞10次,因为在寻找如此好的答案两天后,它让我的一天变得美好,非常感谢你。 - MBH
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接