簡體   English   中英

從遠程通知啟動時如何在導航堆棧中顯示適當的ViewController

[英]How to present appropriate viewcontroller with navigation stack when launching from remote notification

我的目標:當用戶通過響應遠程通知啟動應用程序時,

  1. 應為用戶提供適當的ViewController
  2. ViewController的導航堆棧應該與用戶手動訪問ViewController時的導航堆棧相同。

我的配置: 在此處輸入圖片說明

  • HomeViewController: UITabBarController是根。 每個選項卡都有UINavigationController
  • ConversationGroupTableViewController: UITableViewController在第四個選項卡上,顯示對話組列表。
  • ConversationGroupDetailViewController: UITableViewController從加載tableView(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)
}

我認為我正在朝正確的方向前進,但是我似乎無法確切地知道如何做到這一點。 我將不勝感激任何幫助!

編輯:我做了更多的實驗並更新了代碼。 這段代碼實現了我想要的功能。

@哈方克

延遲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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM