如何实现开关按钮控制UITabBar中‘automatic’项的显示与隐藏?
实现开关控制UITabBar中“Automatic”项的显示与隐藏
没问题,我来一步步教你实现这个需求——用开关按钮控制UITabBar里的「Automatic」项显示或隐藏。下面分Swift和Objective-C两种场景给出详细步骤,你可以按需参考:
核心思路
本质就是根据开关状态动态修改UITabBar的items数组:开启开关时过滤掉「Automatic」项,关闭时恢复原始的全部项。同时要处理选中状态的兼容(避免用户选中的刚好是被隐藏的项导致崩溃),以及状态持久化(下次启动保持上次的设置)。
Swift 实现步骤
1. 准备开关按钮与初始化工作
首先在你的设置页面(或任意需要放置开关的ViewController)中创建UISwitch,并初始化原始的TabBarItems数组:
import UIKit class SettingsViewController: UIViewController { // 弱引用TabBarController,避免循环引用 private weak var tabBarController: UITabBarController? // 保存原始TabBar项,避免重复创建 private var originalTabBarItems: [UITabBarItem]? override func viewDidLoad() { super.viewDidLoad() // 获取当前活跃窗口的根TabBarController(如果你的TabBar不是根控制器,需调整获取方式) tabBarController = UIApplication.shared.connectedScenes .filter({$0.activationState == .foregroundActive}) .map({$0 as? UIWindowScene}) .compactMap({$0}) .first?.windows .filter({$0.isKeyWindow}).first?.rootViewController as? UITabBarController // 初始化原始TabBarItems originalTabBarItems = tabBarController?.tabBar.items // 创建开关按钮 let toggleSwitch = UISwitch(frame: CGRect(x: 20, y: 100, width: 0, height: 0)) toggleSwitch.addTarget(self, action: #selector(toggleTabBarItem(_:)), for: .valueChanged) // 从UserDefaults恢复上次的状态(可选,实现持久化) let isHidden = UserDefaults.standard.bool(forKey: "HideAutomaticTab") toggleSwitch.isOn = isHidden // 应用初始状态 updateTabBarItems(hideAutomatic: isHidden) view.addSubview(toggleSwitch) } }
2. 开关触发逻辑与TabBar更新
添加开关的触发方法,以及核心的TabBar项更新逻辑:
@objc private func toggleTabBarItem(_ sender: UISwitch) { let shouldHide = sender.isOn // 保存状态到UserDefaults UserDefaults.standard.set(shouldHide, forKey: "HideAutomaticTab") // 更新TabBar项 updateTabBarItems(hideAutomatic: shouldHide) } private func updateTabBarItems(hideAutomatic: Bool) { guard let tabBarController = tabBarController, let originalItems = originalTabBarItems else { return } if hideAutomatic { // 过滤掉标题为"Automatic"的项(如果用了本地化,替换为NSLocalizedString("Automatic", comment: "")) let filteredItems = originalItems.filter { $0.title != "Automatic" } tabBarController.tabBar.items = filteredItems // 处理选中状态:如果当前选中的是被隐藏的项,切换到第一个有效项 if let selectedItem = tabBarController.selectedTabBarItem, selectedItem.title == "Automatic" { tabBarController.selectedIndex = 0 } } else { // 恢复原始所有项 tabBarController.tabBar.items = originalItems } }
Objective-C 实现步骤
1. 准备开关与初始化
#import "SettingsViewController.h" @interface SettingsViewController () @property (nonatomic, weak) UITabBarController *tabBarController; @property (nonatomic, strong) NSArray<UITabBarItem *> *originalTabBarItems; @end @implementation SettingsViewController - (void)viewDidLoad { [super viewDidLoad]; // 获取当前活跃窗口的根TabBarController UIWindowScene *scene = (UIWindowScene *)[[UIApplication sharedApplication] connectedScenes].allObjects.firstObject; self.tabBarController = (UITabBarController *)scene.windows.firstObject.rootViewController; // 保存原始项 self.originalTabBarItems = self.tabBarController.tabBar.items; // 创建开关 UISwitch *toggleSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(20, 100, 0, 0)]; [toggleSwitch addTarget:self action:@selector(toggleTabBarItem:) forControlEvents:UIControlEventValueChanged]; // 恢复上次状态 BOOL isHidden = [[NSUserDefaults standardUserDefaults] boolForKey:@"HideAutomaticTab"]; toggleSwitch.on = isHidden; [self updateTabBarItemsWithHideAutomatic:isHidden]; [self.view addSubview:toggleSwitch]; }
2. 开关逻辑与TabBar更新
- (void)toggleTabBarItem:(UISwitch *)sender { BOOL shouldHide = sender.on; [[NSUserDefaults standardUserDefaults] setBool:shouldHide forKey:@"HideAutomaticTab"]; [[NSUserDefaults standardUserDefaults] synchronize]; [self updateTabBarItemsWithHideAutomatic:shouldHide]; } - (void)updateTabBarItemsWithHideAutomatic:(BOOL)hideAutomatic { if (!self.tabBarController || !self.originalTabBarItems) return; if (hideAutomatic) { NSMutableArray *filteredItems = [NSMutableArray array]; for (UITabBarItem *item in self.originalTabBarItems) { // 本地化场景下替换为NSLocalizedString(@"Automatic", nil) if (![item.title isEqualToString:@"Automatic"]) { [filteredItems addObject:item]; } } self.tabBarController.tabBar.items = filteredItems; // 处理选中状态 UITabBarItem *selectedItem = self.tabBarController.selectedTabBarItem; if ([selectedItem.title isEqualToString:@"Automatic"]) { self.tabBarController.selectedIndex = 0; } } else { self.tabBarController.tabBar.items = self.originalTabBarItems; } } @end
关键注意事项
- TabBarController获取方式:如果你的TabBarController不是根控制器,需要通过当前ViewController的
navigationController?.tabBarController或者其他层级关系获取,避免硬编码。 - 本地化兼容:如果你的TabBar项标题用了本地化字符串,过滤时一定要用
NSLocalizedString来匹配,否则切换语言后过滤会失效。 - 循环引用:一定要用弱引用持有TabBarController,否则会导致内存泄漏。
- 状态持久化:UserDefaults适合这种轻量的状态保存,如果是复杂设置可以考虑CoreData或其他持久化方案。
内容的提问来源于stack exchange,提问作者user9547627
相关产品推荐
相关产品推荐

