如何在ButtonBarPagerTabStripViewController分段索引切换时隐藏子视图控制器
首先得明确你要的「隐藏子视图控制器」是两种场景中的哪一种:要么是让某个子VC从分页栏和分页序列中完全移除(不再作为可选分页项),要么是切换到特定分页时,隐藏当前子VC的视图(但它仍保留在分页栏中)。下面针对两种场景分别给出具体解决方案:
场景1:动态移除/隐藏某个分页项(从ButtonBar和控制器列表中移除)
viewControllers(for:)代理方法只会在初始化或调用reloadPagerTabStripView()时生效,所以我们需要维护一个基础控制器数组,再根据当前选中的索引动态生成要显示的数组,步骤如下:
- 先定义两个数组,分别存储所有原始子VC和当前要显示的VC:
// 存储所有子VC(作为数据源) private var allViewControllers: [UIViewController] = [] // 存储当前要显示的VC(动态更新) private var currentDisplayedVCs: [UIViewController] = []
- 在初始化阶段(比如
viewDidLoad)填充原始数组:
override func viewDidLoad() { super.viewDidLoad() // 初始化所有子VC let vc1 = FirstViewController() let vc2 = SecondViewController() let vc3 = ThirdViewController() allViewControllers = [vc1, vc2, vc3] // 初始状态显示全部VC currentDisplayedVCs = allViewControllers }
- 重写
viewControllers(for:)方法,返回当前要显示的数组:
override public func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { return currentDisplayedVCs }
- 监听分页索引切换的代理方法,在切换时更新显示数组并刷新分页组件:
override func updateIndicator(for viewController: PagerTabStripViewController, fromIndex: Int, toIndex: Int) { super.updateIndicator(for: viewController, fromIndex: fromIndex, toIndex: toIndex) // 示例逻辑:切换到索引0时隐藏第二个子VC(原始数组中索引1的VC),切换到其他索引时恢复显示全部 if toIndex == 0 { currentDisplayedVCs = allViewControllers.filter { $0 != allViewControllers[1] } } else { currentDisplayedVCs = allViewControllers } // 必须调用此方法刷新分页栏和控制器列表 pagerTabStripView.reloadPagerTabStripView() // 安全校验:如果刷新后当前选中索引超出新数组范围,手动重置选中索引 if toIndex >= currentDisplayedVCs.count { pagerTabStripView.setSelectedIndex(0, animated: false) } }
场景2:切换到特定分页时,隐藏当前子VC的视图(保留分页项)
如果只是想在切换到某个分页时,隐藏该子VC的视图(比如让页面变成空白,或隐藏内部特定子视图),不需要修改控制器数组,直接操作子VC的视图即可:
- 监听分页切换的代理方法,获取当前选中的子VC并修改视图状态:
override func updateIndicator(for viewController: PagerTabStripViewController, fromIndex: Int, toIndex: Int) { super.updateIndicator(for: viewController, fromIndex: fromIndex, toIndex: toIndex) // 安全获取当前选中的子VC guard let currentVC = currentDisplayedVCs[safe: toIndex] else { return } // 示例逻辑:切换到索引1时隐藏该VC的视图,其他索引时恢复显示 if toIndex == 1 { currentVC.view.isHidden = true } else { // 恢复之前可能隐藏的VC视图 if let hiddenVC = currentDisplayedVCs[safe: 1] { hiddenVC.view.isHidden = false } } }
注意事项:
- 确保你的控制器遵守并正确实现
PagerTabStripViewControllerDelegate的相关方法; - 动态刷新控制器列表时,
reloadPagerTabStripView()会重新加载分页栏和控制器,务必保证当前选中索引在新数组范围内,避免崩溃; - 如果需要更平滑的过渡体验,可以在调用
reloadPagerTabStripView()前添加动画,或使用setSelectedIndex(_:animated:)维持用户操作连贯性。
内容的提问来源于stack exchange,提问作者Asmita
相关产品推荐
相关产品推荐

