我希望能够在满足某个条件后添加新的TabBarItem
。所以最初的应用程序有两个TabBarItems
,但如果你选择以管理员身份登录我想要显示第三个TabBarItem
我可以在我的TabBarItem
的viewDidLoad
中添加TabBarController
罚款,这扩展了UITabBarController
。但是,如果我添加一个名为addNewTabBar
的函数,它调用完全相同的代码,代码将被执行,但视图不会更新。
class TabBarController: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
// let sb = UIStoryboard(name: "Data", bundle: nil)
// let roomChooserVC = sb.instantiateViewController(withIdentifier: "roomchooser") as! RoomChooserController
// roomChooserVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 3)
// self.viewControllers?.append(roomChooserVC)
//
// ^^^^IF I ADD THE TAB IN VIEWDIDLOAD IT WORKS FINE ^^^
}
// If I call addNewTabBarItem() from another class, the methods get executed but the new tab is not shown ---
func addNewTabBarItem(){
let sb = UIStoryboard(name: "Data", bundle: nil)
let roomChooserVC = sb.instantiateViewController(withIdentifier: "roomchooser") as! RoomChooserController
roomChooserVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 3)
self.viewControllers?.append(roomChooserVC)
}
}
现在在我调用方法的类中(省略了一些不相关的代码
let tbController = TabBarController()
override func viewDidLoad() {
super.viewDidLoad()
tbController.addNewTabBarItem()
// If I put a breakpoint in addNewTabBarItem everything's get
// executed fine
// MAYBE RELOAD VIEW OF TABBARCONTROLLER SOMEHOW?
}
你试着得到你的TabBarController
,但你又得到了一个新的。你应该得到你的TabBarController
实例。您可以通过多种方式与其联系。为简单起见,我建议你们其中一个。
首先,在你的main
中声明var TabBarController
:
static var main : TabBarController? = nil
在viewDidLoad
或viewWillAppear
上添加一个代码:
TabBarController.main = self // a part of 'singletone' approach
并在您的另一个控制器使用:
TabBarController.main?. addNewTabBarItem()
您的类用于单个实例非常重要。
第一个选项卡视图控制器中的这一行:
let tbController = TabBarController()
创建TabBarController
的新实例 - 它不提供对现有实例的访问。
所以,在你的第一个标签的视图控制器中:
class HjelmslundFirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// this gets a reference to the existing custom TabBarController
if let tbc = self.tabBarController as? TabBarController {
tbc.addNewTabBarItem()
}
}
}
作为注释,您应始终打开选项,并检查有效对象。那么,在你的自定义TabBarController
类中:
func addNewTabBarItem(){
let sb = UIStoryboard(name: "Data", bundle: nil)
if let roomChooserVC = sb.instantiateViewController(withIdentifier: "roomchooser") as? RoomChooserController {
roomChooserVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 3)
self.viewControllers?.append(roomChooserVC)
}
}
当然,如果if
条件失败,您还需要添加错误处理代码。