以编程方式在Swift中设置tabBarItem标题

34

我有四个UIViewControllers连接到UITabBarController的标签栏。 我需要在故事板之外,在它们的类内设置选项卡栏项目标题。

我已经尝试过...

class MyViewController: UIViewController {

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.title = NSLocalizedString(MyConstants.StringKeys.TabName, tableName: Constants.Strings.MyTable, comment: Constants.EmptyString);
    }
}

这被称为“调用”,但标题从未设置。 同样,使用self.tabBarItem.title =“the title”也是如此。

我还尝试在viewDidLoad中设置标题,但那只会在转到视图控制器后更新标题。

有什么想法吗?

7个回答

42

您可以在视图控制器自身的 viewDidLoad 中设置选项卡标题,方法是设置视图控制器的 title 属性。

title = "Number 0"

或者,如果你想要从标签栏控制器中设置标题,你可以在标签栏控制器的 viewDidLoad 中像这样设置它们:

或者,如果您希望从选项卡栏控制器中设置标题,您可以在选项卡栏控制器的viewDidLoad方法中这样设置它们:

tabBar.items?[0].title = "Number 0"
tabBar.items?[1].title = "Number 1"

11
在我看来,TabBar 不应该在意其视图控制器的命名。 - vahotm
2
在这种情况下,@vahotm可以使用self.navigationItem.title =“Number 0” - Nike Kov

24

我找出问题所在了,看起来它被 awakeFromNib() 覆盖了。

override func awakeFromNib() {
    super.awakeFromNib()

    self.title = NSLocalizedString(MyConstants.StringKeys.TabName, tableName: Constants.Strings.MyTable, comment: Constants.EmptyString);
}

我把self.title的赋值移到那里,这样就解决了我的问题。


14

我尝试了许多解决方案,但唯一有效的方法是在UITabBarControllerviewWillAppear方法中添加选项卡设置代码。我不会在每个视图控制器中单独完成它,因为它只有在按下选项卡按钮时才起作用:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    guard let items = tabBar.items else { return }

    items[0].title = "Title0"
    items[1].title = "Title1"
    items[2].title = "Title2"
    items[3].title = "Title3"
}

1
这对我有效。我尝试了viewDidLoad()和awakeFromNib(),但从那里不起作用。顺便说一下,我认为guard...不好。如果未能为3个项目设置标题,您确实希望获得异常。 - David.Chu.ca
这个对我有效。viewDidLoad没有起作用。 - chengsam

8
在每个viewController.swift文件中,您只需添加以下代码即可解决问题。
    override func awakeFromNib() {
    self.tabBarItem.title = "title"
    self.tabBarItem.image = "image.png"
}

这是一个非常简单的 awakeFromNib 方法,当 Nib 创建时,您可以轻松调用任何东西,因为在 ViewDidLoad 或任何 viewControllerDelegate 方法中点击或选择时都会被调用。所以这是一个非常简单的函数。

谢谢。


2
请注意,如果您的视图控制器在UINavigationController中(您没有子类化),则可以使用navigationController?.tabBarItem.title = "title" - dulgan
1
@dulgan 谢谢,这就是我在寻找的! - ElectroBuddha

3
在第一个视图控制器的ViewDidLoad方法中执行以下操作:
override func viewDidLoad() {

...

    self.tabBarController?.viewControllers?[1].tabBarItem.title = NSLocalizedString("Home", comment: "")
    self.tabBarController?.viewControllers?[2].tabBarItem.title = NSLocalizedString("Tab 1", comment: "")
    self.tabBarController?.viewControllers?[3].tabBarItem.title = NSLocalizedString("Tab 2", comment: "")
    self.tabBarController?.viewControllers?[4].tabBarItem.title = NSLocalizedString("Tab 3", comment: "")

...
}

2
在Swift 5中:
创建自定义Tabbar类。
在ViewDidLoad中添加:
 self.viewControllers?[0].tabBarItem.title = NSLocalizedString("Home", comment: "")
 self.viewControllers?[1].tabBarItem.title = NSLocalizedString("Action", comment: "")
 self.viewControllers?[2].tabBarItem.title = NSLocalizedString("Find LifePass", comment: "")

1
如果您在将视图控制器放入选项卡控制器之前以编程方式创建它们,请尝试以下操作:
override init(style: UITableViewStyle) {
    super.init(style: style)

    self.title = "Title"
}

如果不是一个TableViewController,则为:

或者这样:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

    self.title = "Title"
}

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