如何在 AppDelegate.swift 中按常规顺序调用 ViewController
Posted
技术标签:
【中文标题】如何在 AppDelegate.swift 中按常规顺序调用 ViewController【英文标题】:How to call ViewControllers in regular sequence at AppDelegate.swift 【发布时间】:2018-02-17 12:56:26 【问题描述】:现在我正在开发信使
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...
有效!但我想知道更好的方法。 而且我认为我应该研究窗口和视图控制器的工作原理。
请推荐我更好的方法,并参考文档。 谢谢。
【问题讨论】:
【参考方案1】:您需要在 ChatRoomViewController
中以编程方式处理后退按钮操作以解决您的问题:
点击后退按钮:
检查 MessengerBoxViewcontroller 是否存在于 navigationController 堆栈中。
如果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)
【讨论】:
你试过这个解决方案了吗?以上是关于如何在 AppDelegate.swift 中按常规顺序调用 ViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AppDelegate.swift 路由到任何视图控制器
如何将 AppDelegate Swift 代码放入 Objective-C AppDelegate 文件并使其工作?