当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?

Posted

技术标签:

【中文标题】当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?【英文标题】:How to pop a view controller from a stack when a particular ViewController class was pushed onto stack in another tab? 【发布时间】:2016-07-11 01:47:35 【问题描述】:

我正在开发的应用程序有三个标签,它们都有一个搜索栏,用户可以在任何标签上启动搜索。当搜索开始时,SerchViewController 被推送到每个相应的堆栈上。目前,当用户在选项卡之间切换时,会进行三种不同的搜索。如何确保只有一个 SearchVC 处于活动状态,并且当用户在不同的选项卡上开始搜索时,另一个 SearchVC 在前一个选项卡中从堆栈中弹出?

我该怎么做:

1) 在其中一个堆栈上保留对现有 SearchVC 实例的引用,

2) 如果出现SearchVC,则从另一个导航控制器堆栈接收通知,

3) 并在前一个堆栈中将其弹出(以及所有后续 VC)?

例如:

用户点击第一个选项卡,堆栈构建如下:

UITabBarController -> UINavigationController -> ProfileVC -> GalleryVC -> SearchVC -> (理论上,来自SearchVC的堆栈几乎可以无限建立)-> ProfileVC来自搜索结果 -> GalleryVC -> LikesVC -> ProfileVC -> 等等

用户点击第二个选项卡,堆栈构建如下:

UITabBarController -> UINavigationController -> LibraryVC -> SearchVC -> 再次,堆栈几乎可以无限地从这里构建。我需要在第一个选项卡中弹出SearchVC,因此在选项卡之间切换时只有一个SearchVC。当用户返回到第一个选项卡时,它应该将用户带到用户开始搜索之前的GalleryVC 或VC,并且SearchVC 被压入堆栈。

【问题讨论】:

【参考方案1】:

所以,我想出的解决方案是向提供 SearchVCNavigationController 类添加一个委托协议,并将来自 NavigationController 的消息发送到提供搜索的 UITabBarController

UITabBarController 上的委托方法然后遍历其导航控制器数组并通过将堆栈弹出到 @987654328 来关闭选项卡上的 SearchVC(如果它不是当前选择的选项卡 (self.selectedViewController) @ 然后将其弹出:

[self popToViewController:searchViewController animated:NO];
[super popViewControllerAnimated:NO];

【讨论】:

以上是关于当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在不将 ViewController 对象推入其中的情况下将对象分配给 `UINavigationController`。

将视图控制器推入导航控制器

如何判断我的 ViewController 何时再次成为栈顶?

将相同的视图控制器推入堆栈有奇怪的行为

仅当特定 ViewController 在前台时 iOS Swift 调用函数

单击按钮导航到root viewcontroller