我已经使用app delegate中的代码从主屏幕成功实现了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离开应用程序然后尝试快捷方式,则会收到此错误:
警告:尝试在视图不在窗口层次结构中的(xxxx.ViewController:0x7f9acc83e000)上显示xxx!
如果用户在应用程序中并且最后一个视图是根VC,则主屏幕上的快捷方式效果很好。那么无论上次使用什么VC,我该怎样做才能使它工作得很好?
答案 0 :(得分:1)
你所做的事情的原则是绝对正确的。那么为什么它不起作用呢?
我要做的是让窗口的根视图控制器成为永远不会移位的容器视图控制器 - 所有操作都在其中发生。这样,窗口的根视图控制器不在窗口层次结构中的唯一方式是它具有呈现的视图控制器。你可以很容易地找到它,首先找出它是否有一个呈现的视图控制器,如果有的话,从那里出现。