2016-03-05 123 views
0

我的目标时,如何提出适当的视图 - 控制与导航堆栈:当用户通过响应远程通知启动应用程序,从远程通知启动

  1. 用户应该用适当的ViewController呈现
  2. 的viewcontroller应该具有与用户手动访问viewcontroller时所具有的导航堆栈相同的导航堆栈。

我的配置: enter image description here

  • HomeViewController: UITabBarController是根。每个标签有UINavigationController
  • ConversationGroupTableViewController: UITableViewController位于第四个选项卡并显示对话组列表。
  • ConversationGroupDetailViewController: UITableViewControllertableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)加载到ConversationGroupTableViewController中。它显示该对话组中的消息列表。

示例:通知用户新邮件已到达。当用户通过响应远程通知来启动应用程序时,应向用户呈现ConversationGroupDetailViewController的实例,该实例在其导航堆栈中具有ConversationGroupTableViewControllerHomeViewController,以便用户可以按回按钮以到达它们。

到目前为止的代码: 在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) 
} 

我想我移动到正确的轨道,但我似乎无法弄清楚究竟是如何做到这一点。我将不胜感激任何帮助!

编辑: 我已经做了更多的实验并更新了代码。这段代码做我想要的。

回答

0

@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) 
} 
+0

@harfangk你检查了吗? – Saood

+0

谢谢你的回答,但我认为问题不是延迟,而是获得每个viewcontrollers的正确实例。我得到它的工作和更新代码。 – Harfangk