3D Touch:从当前呈现 VC

3D Touch: Presenting From Current VC

我已经在应用程序委托中使用以下代码成功实现了主屏幕的 3D Touch 快捷方式:

@objc(application:performActionForShortcutItem:completionHandler:) @available(iOS 9.0, *)
func application (_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler completionHandle: @escaping (Bool) -> Void) {
    if shortcutItem.type == "com.myAppName.addtask" {
        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
        let editorVC = storyBoard.instantiateViewController(withIdentifier: "myVC_ID") as! myVC_Class
        let rootVC = UIApplication.shared.keyWindow?.rootViewController
        rootVC?.present(editorVC, animated: false, completion: { () -> Void in
            completionHandle(true)
        })
    }
}

然而,问题是它总是期望从根 viewController 开始呈现。如果用户从另一个 VC 离开应用程序然后尝试快捷方式,我会收到此错误:

Warning: Attempt to present xxx on (xxxx.ViewController: 0x7f9acc83e000) whose view is not in the window hierarchy!

如果用户在应用程序中并且上次查看的是根 VC,则主屏幕的快捷方式效果很好。那么,无论 VC 上次使用的是什么,我该怎么做才能让它正常工作?

你这样做的原则是完全正确的。那为什么它不起作用?

我要做的是让 window 的根视图控制器成为容器视图控制器,永远不会 被替换——所有的动作都发生在它里面。这样,window 的根视图控制器不在 window 层次结构中的唯一方法是它有一个呈现的视图控制器。你可以很容易地找到它,首先找出它是否有一个呈现的视图控制器,如果有,从 that.

呈现