从由 UIApplicationShortcutItem 触发的 AppDelegate 导航到 ViewController
Posted
技术标签:
【中文标题】从由 UIApplicationShortcutItem 触发的 AppDelegate 导航到 ViewController【英文标题】:Navigating to a ViewController from AppDelegate triggered by UIApplicationShortcutItem 【发布时间】:2016-01-19 05:33:31 【问题描述】:在我的应用程序中,启动的第一个视图由RootUIViewController
控制。现在用户可以点击此视图上的任何按钮,然后点击segue
到由LeafUIViewController
控制的视图。每个按钮都指向同一个视图,但某些参数具有不同的值。
现在我已经实现了 3D Touch 快捷菜单,它在AppDelegate
中正确调用了以下函数:
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void)
在这个函数中,我想转到LeafUIViewController
,这样用户仍然可以导航回RootViewController
。
这样做的正确方法是什么,以便正确实例化 Root、推送到堆栈然后视图导航到 Leaf?
【问题讨论】:
【参考方案1】:我建议不要从该回调中执行任何特定于启动操作的启动操作。我通常设置一个全局状态并在我所有相关的视图控制器中处理它。它们通常会弹出到主视图控制器。在那里,我以编程方式执行操作,就像用户通常所做的那样。
优点是视图控制器层次结构以正常方式初始化。然后,状态可以由将显示在屏幕上的第一个视图控制器处理,该视图控制器不一定是应用程序的第一个视图控制器。当用户触发操作时,应用程序可能已经初始化。所以层次结构中可能会有一个随机的视图控制器。
我使用类似的东西:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
if #available(ios 9.0, *)
if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem
handleShortcutItem(shortcutItem)
return true
enum ShortcutType: String
case myAction1 = "myAction1"
case myAction2 = "myAction2"
@available(iOS 9.0, *)
func handleShortcutItem(shortcutItem: UIApplicationShortcutItem) -> Bool
if let shortcutType = ShortcutType.init(rawValue: shortcutItem.type)
switch shortcutType
case .myAction1:
MyHelper.sharedInstance().actionMode = 1
return true
case .myAction2:
MyHelper.sharedInstance().actionMode = 2
return true
default:
return false
return false
然后在主视图控制器(例如主菜单)中以某种方式处理操作:
override func viewDidAppear()
super.viewDidAppear()
switch MyHelper.sharedInstance().actionMode
case 1:
// react on 1 somehow - such as segue to vc1
case 2:
// react on 2 somehow - such as segue to vc2
default:
break
// clear the mode
MyHelper.sharedInstance().actionMode = 0
在其他 vc 中:
override func viewDidLoad()
super viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "reloadView", name: UIApplicationWillEnterForegroundNotification, object: nil)
func reloadView()
if MyHelper.sharedInstance().actionMode
self.navigationController.popToRootViewControllerAnimated(false)
如果您使用多个 vc,这可能不是最好的。如果有更好的东西,我很乐意学习:)
【讨论】:
这是一种有趣的方法,我看到它在从头开始启动应用程序时工作,但是你如何处理应用程序已经启动并且现在在后台的情况,并且用户使用 3D 触控菜单? 对不起。更新以通过侦听 UIApplicationWillEnterForegroundNotification 通知来处理该问题(忘记了 viewDidAppear() 在 viewController 已经启动时不会被调用) 我使用 AppDelegateperformActionForShortcutItem
方法处理了这种情况。我有一个布尔类变量 didFinishLaunchingApp
初始化为 false 并在 AppDelegate finishedLaunchingApp
方法中设置为 true。如果此变量为真,我会从performActionForShortcutItem
向所需的 ViewControllers 发送通知并处理这种情况。这种安排似乎运作良好。感谢您的帮助!以上是关于从由 UIApplicationShortcutItem 触发的 AppDelegate 导航到 ViewController的主要内容,如果未能解决你的问题,请参考以下文章