如何在TabBarController加载它的视图后添加另一个TabBarItem

问题描述 投票:0回答:2

我希望能够在满足某个条件后添加新的TabBarItem。所以最初的应用程序有两个TabBarItems,但如果你选择以管理员身份登录我想要显示第三个TabBarItem

我可以在我的TabBarItemviewDidLoad中添加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?
}
ios swift uitabbarcontroller dynamically-generated
2个回答
0
投票

你试着得到你的TabBarController,但你又得到了一个新的。你应该得到你的TabBarController实例。您可以通过多种方式与其联系。为简单起见,我建议你们其中一个。

首先,在你的main中声明var TabBarController

static var main : TabBarController? = nil

viewDidLoadviewWillAppear上添加一个代码:

TabBarController.main = self // a part of 'singletone' approach

并在您的另一个控制器使用:

TabBarController.main?. addNewTabBarItem()

您的类用于单个实例非常重要。


0
投票

第一个选项卡视图控制器中的这一行:

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条件失败,您还需要添加错误处理代码。

© www.soinside.com 2019 - 2024. All rights reserved.