当特定 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】:所以,我想出的解决方案是向提供 SearchVC
的 NavigationController
类添加一个委托协议,并将来自 NavigationController
的消息发送到提供搜索的 UITabBarController
。
UITabBarController
上的委托方法然后遍历其导航控制器数组并通过将堆栈弹出到 @987654328 来关闭选项卡上的 SearchVC
(如果它不是当前选择的选项卡 (self.selectedViewController
) @ 然后将其弹出:
[self popToViewController:searchViewController animated:NO];
[super popViewControllerAnimated:NO];
【讨论】:
以上是关于当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在不将 ViewController 对象推入其中的情况下将对象分配给 `UINavigationController`。
如何判断我的 ViewController 何时再次成为栈顶?