从 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 快速操作的主要内容,如果未能解决你的问题,请参考以下文章

在我的应用程序中使用 3D Touch

3D Touch的简单使用

快捷方式的 3D Touch 崩溃

应用程序首次启动时 3D Touch 快速操作不起作用

iOS:调用 AppDelegate 的打开 url 时不显示 Touch Id

IOS 实现3D Touch在tableView的简单应用(swift版)