从 AppDelegate 添加 3D Touch 快速操作

Posted

技术标签:

【中文标题】从 AppDelegate 添加 3D Touch 快速操作【英文标题】:Add 3D Touch Quick Actions from AppDelegate 【发布时间】:2017-10-18 19:57:58 【问题描述】:

这就是我的应用的结构。

MainViewController (UITabViewController) --> VC1 (UIViewController) --> AddVC (UIViewController)  
                                         --> VC2 (UIViewController)  
                                         --> VC3 (UIViewController)

我想向我的应用程序添加快速操作,因此当我按下来自AppDelegate 的操作按钮时,我可以访问AddVCVC1 有一个使用 segue 转到 @ 的添加按钮987654325@.

这就是我想要做的:创建AddVC 视图控制器,然后创建MainViewController,然后我从中检索VC1,我尝试用它来呈现AddVC 屏幕。

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) 
    let vc = storyboard.instantiateViewController(withIdentifier: "AddVC") as! AddVC

    switch shortcutItem.type 
    case "Add":
        let mainVC = app?.getRootViewController() as! MainViewController
        let vc1 = mainVC.getVC1()
        DispatchQueue.main.async 
            vc1?.present(vc, animated: true, completion: nil)
        

当我这样做时,它总是转到VC1 视图控制器,而不是AddVC,因此不执行segue。 我还尝试在DispatchQueue 中使用performSegue,效果相同。

有人知道我怎样才能完成这项工作吗?

【问题讨论】:

【参考方案1】:

我猜这是时间问题。

测试的老套方法就是将您的Dispatch 延迟一秒钟(或者无论您的应用启动需要多长时间),然后看看它是否有效。

更好的解决方案是将shouldGoToAddVC 标志添加到VC1 并在viewDidAppear 之后执行present

【讨论】:

我不确定我是否理解。我的应用程序已经启动。我只是退出它并在图标上进行 3D 触摸并按下我的按钮。我不确定为什么会出现时间问题。 因为 VC1 还没有出现在屏幕上。在应用程序的完全激活完成和应用程序完成主屏幕的动画之前,它将无法导航到新的 VC。另请注意,当发生快速操作时,您的应用可能无论如何都无法运行。 哦,我明白你的意思了。我添加了一个 sleep(3) 并收到此警告:尝试在 上呈现 其视图不在窗口层次结构中! 听起来 VC1 不在屏幕上 是的,我尝试了您的解决方案,但我需要一个自定义通知来通知应用何时进入前台,而不是 viewDidAppear,因为在我的情况下不会调用 viewDidAppear。问题仍然是,在我从 AppDelegate 设置标志之前调用了该事件。

以上是关于从 AppDelegate 添加 3D Touch 快速操作的主要内容,如果未能解决你的问题,请参考以下文章