如何在 AppDelegate.swift 按规则顺序调用 ViewController

How to call ViewControllers in regular sequence at AppDelegate.swift

现在我正在开发 Messenger

MessengerBox 是 tableViewController,当用户点击其中一个单元格时,会显示 chatRoomViewcontroller。

如果应用程序不是 运行 并且消息已到达,则会显示推送通知。然后用户点击通知,App 直接显示 chatRoomViewcontroller。

最初,我使用 window.rootViewController

实现了这段代码

但是问题发生了。当我点击 chatRoomviewController 的后退按钮时,更改没有发生,因为这个视图控制器是 rootview 并且它的 presentingViewController 是空的!

所以我像下面这样修复了它

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    ///some code for notification..

        let mVC  //this is MessengerBoxViewcontroller
        let crVC  //this is ChatRoomViewController


        CRVC?.sender = "asdf"
        do{
            self.window?.rootViewController = mVC
            self.window?.makeKeyAndVisible()
            defer{
                mVC?.presentChatRoomVC()
            }
        }

     /// some code...
}

有效!但我想知道更好的方法。 而且我认为我应该研究 window 和 viewcontrollers 的工作原理。

请推荐我更好的方法,并参考文档。 谢谢。

您需要在 ChatRoomViewController 中以编程方式处理后退按钮操作以解决您的问题:

在后退按钮上点击:

  1. 检查 NavigationController 堆栈中是否存在 MessengerBoxViewcontroller。

  2. 如果 MessengerBoxViewcontroller 在 navigationController 堆栈中,则弹出以移回 MessengerBoxViewcontroller

  3. 其他存在 MessengerBoxViewcontroller.

    if let viewControllers = self.navigationController?.viewControllers {
         for viewController in viewControllers {
    
            if viewController.isKindOfClass(MessengerBoxViewcontroller) {
                print("Your controller exist")
                navigationController?.popViewController(animated: true)
    
             }
          }
    }
    else {
         let vc = self.storyboard?.instantiateViewController(withIdentifier: "messengerBoxViewcontroller") as! MessengerBoxViewcontroller
         self.present(vc, animated: true, completion: nil)
    }