模态展示ViewController时如何禁用所有UITabBarItems并恢复?代理实现疑问
解决方案:模态展示VC时禁用UITabBar切换
嘿,你的这个方案完全可行!其实不需要特意“获取当前可见的模态ViewController”,只需要通过系统自带的ViewController属性就能判断是否有模态VC正在展示,进而在代理方法里阻止Tab切换。我给你两种实用的实现方式:
方法一:利用presentedViewController直接判断
这种方式最直接,不需要额外维护状态,完全依赖UIKit自带的属性:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { // 获取当前选中的Tab对应的ViewController UIViewController *currentSelectedVC = tabBarController.selectedViewController; // 判断是否有模态VC正在展示(排除正在被 dismiss 的情况) if (currentSelectedVC.presentedViewController != nil && !currentSelectedVC.presentedViewController.isBeingDismissed) { // 存在活跃的模态VC,不允许切换Tab return NO; } // 无模态VC,允许正常切换 return YES; }
原理说明
因为你是从当前选中的Tab对应的VC模态弹出新页面的,所以currentSelectedVC.presentedViewController就是那个模态展示的VC。只要这个属性不为空,且VC不是正在被关闭的状态,就说明有模态页面在前台,此时返回NO就能阻止Tab切换。
方法二:通过自定义标记维护状态
如果你的场景更复杂(比如存在多层模态弹出),可以给TabBarController添加一个自定义标记来控制:
- 首先在你的
UITabBarController子类里添加属性:
@property (nonatomic, assign) BOOL isModalPresented;
- 在你要弹出模态VC的地方,先设置标记:
// 弹出前标记为“有模态VC展示” self.tabBarController.isModalPresented = YES; // 弹出模态VC [self presentViewController:yourModalVC animated:YES completion:nil];
- 在模态VC的
viewWillDisappear方法里恢复标记:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // 只有当VC被dismiss时才恢复标记 if (self.isBeingDismissed) { self.presentingViewController.tabBarController.isModalPresented = NO; } }
- 最后在TabBar代理方法里判断标记:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { return !tabBarController.isModalPresented; }
总结
你的初始思路是对的,通过shouldSelectViewController代理来拦截Tab切换完全可行。第一种方法更简洁,适合大多数普通场景;第二种方法更灵活,适配复杂的模态层级。选哪种就看你的具体需求啦~
内容的提问来源于stack exchange,提问作者amirtmgr
相关产品推荐
相关产品推荐

