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

时间:2016-07-11 01:47:36

标签: ios uiviewcontroller tabs uinavigationcontroller uitabbarcontroller

我正在处理的应用程序有三个选项卡,都有一个搜索栏,用户可以在任何选项卡上启动搜索。启动搜索时,会将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 个答案:

答案 0 :(得分:1)

因此,我提出的解决方案是向NavigationController类添加委托协议,该类提供SearchVC并将NavigationController的消息发送到UITabBarController该搜索被介绍了。

UITabBarController上的委托方法然后遍历其导航控制器数组并解除选项卡上的SearchVC,如果它不是当前选中的那个(self.selectedViewController通过将堆栈弹出到SearchVC然后将其弹出:

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