Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在从远程通知启动时为相应的viewcontroller提供导航堆栈_Ios_Swift_Uiviewcontroller - Fatal编程技术网

Ios 如何在从远程通知启动时为相应的viewcontroller提供导航堆栈

Ios 如何在从远程通知启动时为相应的viewcontroller提供导航堆栈,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,我的目标:当用户响应远程通知启动应用程序时 应向用户提供适当的viewcontroller viewcontroller的导航堆栈应与用户手动访问viewcontroller时的导航堆栈相同 我的配置: HomeViewController:UITabBarController是根。每个选项卡都有UINavigationController ConversationGroupTableViewController:UITableViewController位于第四个选项卡上,显示对话组列表

我的目标:当用户响应远程通知启动应用程序时

  • 应向用户提供适当的viewcontroller
  • viewcontroller的导航堆栈应与用户手动访问viewcontroller时的导航堆栈相同 我的配置:

    • HomeViewController:UITabBarController
      是根。每个选项卡都有
      UINavigationController
    • ConversationGroupTableViewController:UITableViewController
      位于第四个选项卡上,显示对话组列表
    • ConversationGroupDetailViewController:UITableViewController
      tableView(tableView:UITableView,didSelectRowAtIndexPath:nsindepath)
      中的
      加载。它显示该对话组中的消息列表
    示例案例:通知用户新消息已到达。当用户响应远程通知启动应用程序时,应向用户显示一个
    ConversationGroupDetailViewController
    实例,该实例在其导航堆栈中包含
    ConversationGroupTableViewController
    HomeViewController
    ,以便用户可以按后退按钮到达它们

    迄今为止的代码: 在
    AppDelegate.swift
    中:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)    
        application.registerUserNotificationSettings(notificationSettings)
        application.registerForRemoteNotifications()
    
        if let notificationDictionary = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {
            instantiateViewControllerFromNotification(notificationDictionary)
        }
        return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    func instantiateViewControllerFromNotification(notificationDictionary: NSDictionary) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let initialViewController = self.window?.rootViewController as! UITabBarController
        initialViewController.selectedIndex = 3
    
        let navigationController = initialViewController.viewControllers![3] as! UINavigationController
        let detailViewController = storyboard.instantiateViewControllerWithIdentifier("ConversationGroupDetailViewController") as! ConversationGroupDetailViewController
    
        navigationController.popToRootViewControllerAnimated(false)
        navigationController.pushViewController(detailViewController, animated: false)
    }
    
    我想我走上了正确的轨道,但我似乎不知道该怎么做。我将感谢任何帮助

    编辑: 我做了更多的实验并更新了代码。此代码符合我的要求。

    @Harfangk

    延迟1秒后调用此方法。因为您在启动应用程序时正在推送控制器

    func instantiateViewControllerFromNotification(notificationDictionary: NSDictionary) {
      let storyboard = UIStoryboard(name: "Main", bundle: nil)
      let initialViewController = storyboard.instantiateInitialViewController() as! UITabBarController
      initialViewController.selectedIndex = 3
    
      let navigationController = storyboard.instantiateInitialViewController().viewControllers![3] as! UINavigationController
      let tableViewController = storyboard.instantiateViewControllerWithIdentifier("ConversationGroupTableViewController") as! ConversationGroupTableViewController
      let detailViewController = storyboard.instantiateViewControllerWithIdentifier("ConversationGroupDetailViewController") as! ConversationGroupDetailViewController
    
      navigationController.pushViewController(tableViewController, animated: false) 
      navigationController.pushViewController(detailViewController, animated: false)
    }
    

    @harfangk你检查过了吗?谢谢你的回答,但我认为问题不在于延迟,而在于获得每个ViewController的正确实例。我让它工作并更新了代码。