【问题标题】:3D touch quick actions preview view controller only one time3D 触摸快速动作预览视图控制器仅一次
【发布时间】:2015-12-02 18:08:50
【问题描述】:

我有以下问题。当我在手机上运行我的应用程序时,3d 触摸图标并选择快速操作,它会启动应用程序并显示正确的视图控制器,但是当我将应用程序置于后台并尝试调用快速操作时,它只会打开我拥有的应用程序留下它。所以为了让它工作,我每次都必须杀死我的应用程序。 这是我的代码:

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)
        })

    }
}

提前致谢。

【问题讨论】:

  • 它是否调用 performActionForShortcutItem? root = nil 吗?
  • 它必须在哪里调用performActionForShortcutItem?
  • 我的意思是尝试在 performActionForShortcutItem 中打印一些内容以确保它被调用。也许 print(root) 可以检查是否调用了 performActionForShortcutItem 并检查以确保 root 不为零。
  • 问题是它只在我启动应用程序后调用该方法一次,然后如果我将它放在后台并尝试调用该方法,则没有任何反应。
  • 你知道它没有调用它吗?或者它可能会被调用但不做任何事情?按照我的建议去做将有助于我们确定它是什么。你这样做吗?结果如何?

标签: ios swift 3dtouch quickaction


【解决方案1】:

我猜你正试图从一个不可见的视图控制器呈现一个视图控制器。您可以使用以下扩展名:

    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()
    }
}

您可以将这两者都放在您的应用程序 delegate.swift 中,在您的应用程序委托类之上,以获取当前可见的视图控制器。 然后在其上显示搜索视图控制器。例如:

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)
        })

    }
}

【讨论】:

  • 谢谢,但我仍然不明白该函数在哪里以及在哪里调用它。
  • 对不起,我遗漏了一些东西。
  • 这行报错:extension UIViewController { Declaration is only valid at file scope
  • 您是否像我添加的屏幕截图一样复制它?
  • 是的,我把它放在@ApplicationMain 之后。但是即使在我实现了您所展示的扩展之后,func 应用程序也只是在它启动后的第一次工作。当它进入后台时,它就不再起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多