【问题标题】:iOS Swift Navigate to certain ViewController programmatically from push notificationiOS Swift 从推送通知以编程方式导航到某些 ViewController
【发布时间】:2017-08-20 20:38:59
【问题描述】:

我使用推送通知来通知用户应用中发生的不同类型的事件。某种类型的推送通知应该打开一个特殊的视图控制器(例如,关于新聊天消息的通知确实会在点击时导航到聊天)

为了实现这一点,我在我的应用委托中尝试了以下代码:

func applicationDidBecomeActive(_ application: UIApplication) {
 if var topController = UIApplication.shared.keyWindow?.rootViewController {
        while let presentedViewController = topController.presentedViewController {
            topController = presentedViewController
        }
        topController.tabBarController?.selectedIndex = 3
    }
}

它不会移动到任何地方。我在这里错过了什么?

【问题讨论】:

  • 所以你在这里有一个标签栏,你希望它在每次应用激活时转到标签#4?
  • 选择了 didbecomeactive 来测试它,但是是的,我有一个标签栏控制器,并且标签 #4 是正确的
  • 把你的rootViewController改成标签栏控制器就OK了
  • 可能为 topController 添加as! UITabbarViewController 会起作用

标签: ios swift navigation uitabbarcontroller appdelegate


【解决方案1】:

我编写了一个简单的类,只需传递类类型即可从一行代码中的任何位置导航到视图层次结构中的任何视图控制器,因此您将编写的代码也将与视图层次结构本身解耦,因为实例:

Navigator.find(MyViewController.self)?.doSomethingSync()
Navigator.navigate(to: MyViewController.self)?.doSomethingSync()

..或者你也可以在主线程上异步执行方法:

Navigator.navigate(to: MyViewController.self) { (MyViewControllerContainer, MyViewControllerInstance) in
    MyViewControllerInstance?.doSomethingAsync()
}

这里是 GitHub 项目链接:https://github.com/oblq/Navigator

【讨论】:

  • 这段代码在哪里写?因为我收到错误“NotificationVC”类型的值没有成员“doSomethingSync”,NotificationVC 是我的视图控制器
  • @roshanposakya 'doSomethingSync' 是一个发明的函数,设置你的 'NotificationVC' 的真实函数。 Navigator.find 或 Navigator.navigate 返回您的 VC 的实例,因此,Navigator.find(NotificationVC.self) 与调用 NotificationVC() 完全一样……所以,在 Navigator.find(NotificationVC.self)? 之后。您可以调用任何 NotificationVC func 或 var。
【解决方案2】:

这正是您所需要的。
使用导航控制器推送通知视图控制器

    let mainStoryBoard : UIStoryboard       = UIStoryboard(name: "Main", bundle: nil)
    let navigationController : UINavigationController = mainStoryBoard.instantiateViewController(withIdentifier: "MainNavigationController") as! UINavigationController

    let notifcontrol : UIViewController     = (mainStoryBoard.instantiateViewController(withIdentifier: "NotificationViewController") as? NotificationViewController)!

    navigationController.pushViewController(notifcontrol, animated: true)

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

【讨论】:

    【解决方案3】:

    在这种情况下,topController 已经是我的 TabBarController!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多