如何获取UITabBarController自动生成的更多页TableView并移除分隔线
解决UITabBarController“更多”页面TableView分隔线移除问题
这个问题我之前也碰到过,要搞定这个其实得绕一下Apple的私有类限制——毕竟那个承载额外标签的“更多”页面控制器是UITabBarMoreViewController,属于私有API范畴,不能直接强转调用,但我们还是有办法拿到里面的TableView并自定义它的,具体操作如下:
实现步骤
- 获取“更多”页面的控制器:UITabBarController自带一个
moreNavigationController属性,当标签数量超过5个时,这个导航控制器的顶层视图控制器就是管理“更多”列表的那个私有控制器。 - 定位到内部的TableView:因为不能直接访问私有类的属性,我们可以通过两种方式拿到TableView:
- 方式一:利用KVC获取私有属性(注意:私有属性可能随iOS版本变更,有一定风险)
- 方式二:遍历控制器视图的子视图,找到UITableView实例(更稳妥,兼容性更好)
代码示例(Swift)
在你自定义的UITabBarController子类中,添加如下代码:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 确保more导航控制器存在且顶层控制器已加载 guard let morePageController = moreNavigationController?.topViewController else { return } // 方式1:通过KVC获取私有tableView属性 if let moreTableView = morePageController.value(forKey: "tableView") as? UITableView { moreTableView.separatorStyle = .none } // 方式2:遍历子视图查找UITableView(推荐,避免版本变更风险) /* for subview in morePageController.view.subviews { if let tableView = subview as? UITableView { tableView.separatorStyle = .none break // 找到后直接跳出循环,提升效率 } } */ }
注意事项
- 不要在
viewDidLoad中执行这段代码:因为此时moreNavigationController的顶层控制器可能还未完成初始化,会导致获取不到TableView。viewDidAppear是更安全的时机,或者你也可以在设置完所有TabBarItem之后延迟执行。 - 关于私有API风险:方式一用到了KVC访问私有属性,虽然Apple在审核时一般不会因为这个拒绝(因为我们只是读取属性而非调用私有方法),但如果后续iOS版本修改了这个私有属性名,代码会失效。所以更推荐方式二。
内容的提问来源于stack exchange,提问作者Thomas Marques
相关产品推荐
相关产品推荐

