如何在 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
中以编程方式处理后退按钮操作以解决您的问题:
在后退按钮上点击:
检查 NavigationController 堆栈中是否存在 MessengerBoxViewcontroller。
如果 MessengerBoxViewcontroller
在 navigationController 堆栈中,则弹出以移回 MessengerBoxViewcontroller
。
其他存在 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)
}
现在我正在开发 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
中以编程方式处理后退按钮操作以解决您的问题:
在后退按钮上点击:
检查 NavigationController 堆栈中是否存在 MessengerBoxViewcontroller。
如果
MessengerBoxViewcontroller
在 navigationController 堆栈中,则弹出以移回MessengerBoxViewcontroller
。其他存在
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) }