如何仅在切换TabBar索引显示页面时执行代码,而非模态页关闭时?
解决TabBar仅切换到第三个标签页时刷新的问题
我刚好遇到过类似的场景,你的核心需求是仅当通过TabBar主动选中第三个标签页时才触发刷新,而viewWillAppear会在太多场景下触发(比如关闭模态页、选择照片返回),viewDidLoad又只能执行一次,这时候可以用以下两种精准的实现方式:
方法一:利用UITabBarController代理(推荐)
这种方式最直接,通过TabBar的代理方法监听选中事件,只在选中第三个标签页时调用刷新逻辑:
- 自定义你的TabBarController,遵循
UITabBarControllerDelegate协议:
class CustomTabBarController: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() { super.viewDidLoad() // 设置代理为自身 self.delegate = self } // 监听TabBar选中事件 func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { // 第三个标签页的索引是2(从0开始计数) if let thirdTabVC = viewController as? ThirdTabViewController, tabBarController.selectedIndex == 2 { // 调用第三个页面的刷新方法 thirdTabVC.refreshContent() } } }
- 在第三个标签页的ViewController中定义专属的刷新方法:
class ThirdTabViewController: UIViewController { // 自定义刷新方法,存放你的刷新逻辑 func refreshContent() { // 这里写你的具体刷新代码,比如重新请求接口、更新列表数据等 print("仅通过TabBar切换时,刷新第三个标签页内容") } // 保留viewWillAppear处理其他通用逻辑(比如状态栏样式、导航栏设置),不要在这里放刷新代码 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 处理非刷新的显示逻辑 } }
方法二:在第三个页面内监听TabBar选中状态(备选)
如果不想修改TabBarController的代码,可以在第三个页面里通过KVO监听TabBarController的selectedIndex变化:
class ThirdTabViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 监听TabBarController的selectedIndex属性变化 tabBarController?.addObserver(self, forKeyPath: "selectedIndex", options: [.new], context: nil) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard keyPath == "selectedIndex", let newIndex = change?[.newKey] as? Int else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) return } // 当选中索引为2时,执行刷新 if newIndex == 2 { refreshContent() } } func refreshContent() { // 你的刷新逻辑 } deinit { // 记得移除观察者,避免内存泄漏 tabBarController?.removeObserver(self, forKeyPath: "selectedIndex") } }
为什么之前的方法不适用?
viewWillAppear:这个方法会在任何视图即将显示时触发,包括从模态页面返回、从UIImagePickerController选择照片返回、从导航栈返回等,无法区分是否是通过TabBar切换过来的。viewDidLoad:仅在ViewController首次初始化加载时调用一次,后续切换Tab不会重新执行,满足不了每次切换都刷新的需求。
内容的提问来源于stack exchange,提问作者Bogdan Razvan
相关产品推荐
相关产品推荐

