Swift中如何基于UserDefaults数组的array.count设置UITabBar Badge?
实现动态更新UITabBar Badge显示UserDefaults数组元素数量
我来给你一步步拆解实现方法,都是实际项目里常用的靠谱方案:
1. 监听UserDefaults中数组的变化
因为数组存在UserDefaults里,要实现动态更新badge,得实时感知数组的变动。我们可以用UserDefaults.didChangeNotification通知来监听变化:
// 在你的TabBarController的viewDidLoad中添加监听 override func viewDidLoad() { super.viewDidLoad() // 监听UserDefaults的变更通知 NotificationCenter.default.addObserver(self, selector: #selector(updateTabBarBadge), name: UserDefaults.didChangeNotification, object: nil) // 页面初始化时先手动设置一次badge值 updateTabBarBadge() } // 记得在销毁时移除监听,避免内存泄漏 deinit { NotificationCenter.default.removeObserver(self) }
2. 编写Badge更新逻辑
接下来实现核心的updateTabBarBadge方法,负责从UserDefaults取数组、计算数量,再同步到对应TabBarItem上:
@objc private func updateTabBarBadge() { // 替换成你自己存储数组的UserDefaults Key let targetArray = UserDefaults.standard.array(forKey: "YourCustomArrayKey") ?? [] let itemCount = targetArray.count // 获取你要设置badge的TabBarItem,比如第二个tab就用索引1,按需调整 guard let targetTabItem = tabBar.items?[0] else { return } // 数量为0时隐藏badge,否则显示数字 targetTabItem.badgeValue = itemCount > 0 ? "\(itemCount)" : nil // 可选:自定义badge样式,比如红色背景+白色文字 targetTabItem.badgeColor = .systemRed targetTabItem.setBadgeTextAttributes([.foregroundColor: UIColor.white], for: .normal) }
3. 关键注意点
- 数组修改后要同步UserDefaults:每次修改数组后,务必调用同步方法(iOS10+虽自动同步,但手动调用更稳妥),这样通知才会触发。示例:
// 修改数组并同步到UserDefaults var tempArray = UserDefaults.standard.array(forKey: "YourCustomArrayKey") ?? [] tempArray.append("new element") UserDefaults.standard.set(tempArray, forKey: "YourCustomArrayKey") UserDefaults.standard.synchronize()
- 索引对应正确:确认
tabBar.items的索引和你要设置badge的tab对应,别搞混顺序。 - 更安全的监听方式(iOS10+):可以用Block-based的通知监听,不用手动移除,减少内存泄漏风险:
NotificationCenter.default.addObserver(forName: UserDefaults.didChangeNotification, object: nil, queue: .main) { [weak self] _ in self?.updateTabBarBadge() }
这样设置后,只要UserDefaults里的数组发生变化,TabBar的Badge就会自动更新啦,亲测好用!
内容的提问来源于stack exchange,提问作者Bogdan59
相关产品推荐
相关产品推荐

