You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现开关按钮控制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:53:44