如何使用Swift代码在UITabBarController中编程添加选项卡?

49
如何从任何继承自UIViewController的类中编程创建选项卡:
class DashboardTabBarController: UITabBarController {

    override func viewDidLoad() {
        //here

    }
 ...

}

1
你看过这个文档了吗? - Ron Fessler
3个回答

88

更新SWIFT 5

创建UITabBarController的编程示例之一可能如下:

首先,我们会创建UIViewControllers,作为选项卡栏接口每个选项卡的内容。对于此示例,我们只创建了一个非常简单的。

class Item1ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.green
        self.title = "item1"
        print("item 1 loaded")
    }
}

现在,是UITabBarController的时候了:

我们创建想要在选项卡栏中显示的UIViewControllers的新实例。然后,我们为每个创建的实例创建一个图标,然后创建一个包含所有UIViewControllers的数组,该数组指定选项卡栏界面每个选项卡的内容。数组中视图控制器的顺序对应于选项卡栏中的显示顺序

class DashboardTabBarController: UITabBarController, UITabBarControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let item1 = Item1ViewController()
        let icon1 = UITabBarItem(title: "Title", image: UIImage(named: "someImage.png"), selectedImage: UIImage(named: "otherImage.png"))
        item1.tabBarItem = icon1
        let controllers = [item1]  //array of the root view controllers displayed by the tab bar interface
        self.viewControllers = controllers
    }

    //Delegate methods
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        print("Should select viewController: \(viewController.title ?? "") ?")
        return true;
    }
}

你好!我做了这样的事情,但是当tabbarcontroller被加载时,它不会突出显示uitabbaritem图标。 - Alexander Khitev
1
@Alexsander 在viewWillAppear()的底部添加"self.selectedIndex = 0"。 - Neil
1
ViewDidLoad 中添加 VCs 也可以,我想知道为什么你更喜欢使用 viewWillAppear - Husam
2
我尝试了相同的方法,但选项卡栏没有显示。除此之外,我还需要做些什么吗?DashboardTabBarController -> viewWillAppear 没有被调用。 - Ajay
创建选项卡的视图控制器不应该在viewWillAppear中完成。viewDidLoad是更好的选择。此外,无需创建UITabBarItem的新实例。每个视图控制器已经有一个。只需设置其属性即可。 - HangarRash

12

如果您在视图控制器中使用了故事板,则必须按照以下方式在标签栏控制器类中编写代码。

class CustomTabbarController : UITabBarController {

    override func viewDidLoad() {

        super.viewDidLoad()

        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let firstViewController = FirstViewController()
        let navigationController = UINavigationController(rootViewController: firstViewController)
        navigationController.title = "First"
        navigationController.tabBarItem.image = UIImage.init(named: "map-icon-1")

       viewControllers = [navigationController]

        if let secondViewController = storyboard.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController {

            let navgitaionController1 = UINavigationController(rootViewController: secondViewController)
            navgitaionController1.title = "Second"
            navgitaionController1.tabBarItem.image = UIImage.init(named: "second-icon-1")
            var array = self.viewControllers
            array?.append(navgitaionController1)
            self.viewControllers = array

        }

    }
}

不要在导航控制器上设置标题属性。应该在视图控制器上设置标题属性。如果您想要选项卡具有特定的标题,请设置相关tabBarItem的标题(就像图片一样)。 - HangarRash

-1
    private lazy var tabbarViewController: UITabBarController = {
            let tabbarViewController = UITabBarController()
            tabbarViewController.setViewControllers([startVC,
                                                     offerVC,
                                                     benefitsVC,
                                                     shopVC,
                                                     recipesVC], animated: true)
            
            return tabbarViewController
        }()

window?.rootViewController = tabbarViewController

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接