如何在Xcode(Swift4)开发的标签页应用中保存用户标签重排顺序?
实现标签页排序持久化的方案
这个问题我做项目时也碰到过,核心思路就是把用户调整后的标签顺序存下来,下次启动时再恢复就行,具体可以按这几步操作:
1. 给每个标签页VC设置唯一标识符
首先得给UITabBarController里的每个ViewController分配唯一标识,这样才能准确记录它们的顺序:
- 要是用Storyboard创建的VC,直接在Identity Inspector里设置
Restoration ID,比如首页设为HomeTabVC、消息页设为MessageTabVC; - 要是代码创建的VC,可以给每个VC加个自定义属性,比如
var tabIdentifier: String = "",初始化时赋值。
2. 监听标签页重排完成事件
UITabBarController提供了代理方法来监听用户完成标签自定义的动作,我们可以在这里获取新顺序并保存:
先让你的UITabBarController类遵守UITabBarControllerDelegate协议,然后实现下面的方法:
func tabBarController(_ tabBarController: UITabBarController, didEndCustomizing viewControllers: [UIViewController], changed: Bool) { // 只有顺序真的改变了才执行保存逻辑 guard changed else { return } // 将当前VC的标识符转换成数组 let tabIdentifiers = viewControllers.compactMap { vc in // 用Storyboard的Restoration ID就用这个 return vc.restorationIdentifier // 用自定义属性的话就换成:vc.tabIdentifier } // 保存到UserDefaults UserDefaults.standard.set(tabIdentifiers, forKey: "SavedTabBarOrder") // 立即同步(可选,确保数据马上写入本地) UserDefaults.standard.synchronize() }
别忘了在viewDidLoad里给UITabBarController设置代理:self.delegate = self。
3. 应用启动时恢复标签顺序
接下来在应用启动或者UITabBarController初始化时,读取保存的顺序并恢复:
比如在UITabBarController的viewDidLoad里添加这段代码:
override func viewDidLoad() { super.viewDidLoad() self.delegate = self // 读取保存的标识符数组 guard let savedIdentifiers = UserDefaults.standard.array(forKey: "SavedTabBarOrder") as? [String], !savedIdentifiers.isEmpty else { // 没有保存数据就用默认顺序,无需额外操作 return } // 获取当前所有的标签页VC let originalVCs = self.viewControllers ?? [] // 构建标识符到VC的映射字典,方便快速查找 var vcMap = [String: UIViewController]() for vc in originalVCs { if let id = vc.restorationIdentifier { vcMap[id] = vc } // 用自定义属性的话换成:vcMap[vc.tabIdentifier] = vc } // 根据保存的标识符顺序重新排序VC数组 let sortedVCs = savedIdentifiers.compactMap { vcMap[$0] } // 确保排序后的数组数量和原数组一致(避免标识符错误导致VC缺失) if sortedVCs.count == originalVCs.count { self.viewControllers = sortedVCs } }
额外注意事项
- 每个VC的标识符要唯一且固定,不要随便修改,否则恢复时会找不到对应VC;
- 如果标签页数量会动态变化,要额外处理新增/删除标签的情况,比如保存时过滤掉不存在的标识符;
- UserDefaults适合存储这种轻量配置数据,要是有更复杂的自定义配置需求,可以考虑用Core Data或本地文件存储,但这个场景下UserDefaults完全够用。
这样处理后,用户调整完标签顺序,关闭应用再打开就能保持上次的排序了。
内容的提问来源于stack exchange,提问作者Trgrit Tjforce
相关产品推荐
相关产品推荐

