更改 uitabbarcontroller 中的选项卡名称

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

我有一个 TabBarController 设置为主控制器选项卡,其中名称是使用界面生成器定义的。现在我想以编程方式更改其名称。

怎么办?

ios objective-c iphone cocoa-touch uitabbarcontroller
7个回答
52
投票

更新至 XCode 15(Swift UI)

已经有一段时间了,该线程上的所有历史记录仍然适用,并且相同的逻辑适用于 SwiftUI:它查找第一个视图来设置其选项卡栏项目(导航项目相同),并且所有视图都实现它:

var body: some View {
    <Your View stuff>
    .tabItem({ Label(tab.title, systemImage: "house.fill" ) })
}

由于它是可组合的,您可以在您定义的视图上或直接在选项卡栏上执行此操作。

TabView() {
        MyView().tabItem({ Label(tab.title, systemImage: "house.fill") })
        OtherView().tabItem({ Label(tab.title, systemImage: "star.fill") })
    }

更新至 XCode 8(故事板)

自从我最初的回答以来,发生了很多事情:Swift 3、故事板等。标题通常是所有视图共享的,可以在属性检查器中设置

Title Setup

此外,为了进行更多控制,您可以随时从设计器视图中拖动

UITabBarItem
UINavigationItem
元素。您必须将它们拖动到将在选项卡栏/导航控制器中显示的视图。基本上他们将信息存储为“我想像这样显示在标签栏中”。

enter image description here

Hello Scene 正在添加一个 TabBarItem,因此可以对其进行配置。

这两个元素的行为与通过代码访问视图控制器的

.tabBarItem
.navigationItem
属性完全相同。如果这些属性是相应对象的子级(nav 有 navItem,tab 有 tabItem),则它们始终存在于代码中,您无需将它们添加到 Storyboard/xib 中即可拥有它们。

最后一件事有点令人困惑,因为在情节提要/xib 中,您似乎将它们添加到视图控制器中,但实际上您只是说“笔尖也会配置这些属性”。

原答案

标签栏上显示的名称来自

UIViewController
title
属性,

self.title = @"Name me!";

您可以随时更改标题,并且它应该更新选项卡栏项目上显示的文本。但要小心,尽快执行此操作,最好是使用正在使用的

init
方法(或
initWithNibName:bundle:
,或
initWithCoder:
)。

这里的关键是,一旦选项卡栏出现在屏幕上,就会调用 init 方法,因为它初始化了所有视图控制器。如果您要在

viewDidLoad
上执行此操作,则只有在您实际选择该选项卡时才会被调用,然后其他系列的调用,同样适用于
awakeFromNib
viewWillAppear:
viewDidAppear:
等。

UIViewController
上设置标题的想法是为了保持一致。如果您在
UINavigationController
上显示 viewController,则顶部的导航栏应使用 title 属性,就像使用 back 时一样。
UITabBarController
也尊重相同的标题属性并相应更改。

就可重用性而言,您应该仅从

UIViewController
子类内部设置标题。

笔尖之道

使用笔尖或故事板?如果您有

UIViewController
,您可以在属性检查器中直接为其指定名称(或 4

Using interface builder, in the Attributes Inspector

不幸的是,如果文件所有者是

UIViewController
子类,那么您将无法通过这种方式访问它,因为XCode将文件所有者注册为“外部对象”,并且不显示配置面板为了它。 :(

多个标题,相同的视图控制器

但有时,您只是想让它们以不同的方式命名

// Modify the display title on the tab bar
self.tabBarItem.title = @"World";

// Modify the display title on the navigation bar
self.navigationItem.title = @"Hello World";

与邻居发生关系

每个 UIViewController 都应该处理自己的名称,如果你想从外部强制它怎么办(从而完全违反了我最初所说的可重用性)?

// Rename the other guy's .title property
[[self.tabBarController.viewControllers objectAtIndex:<#Index#>] setTitle:@"Hello World"];

// Or do as before, and rename the other guy's tab bar 
[(UITabBarItem*)[self.tabBarController.tabBar.items objectAtIndex:<#index#>] setTitle:@"Hello World"];

您也可以使用导航项来完成此操作,但这需要更多的体操,超出了我的适应范围。


38
投票

但是可以用代码来完成,最好直接在Storyboard中设置。怎么办?

只需点击相应的标签栏项目控制器内不在标签栏控制器内)。

enter image description here

然后切换到

Utilities
面板上的 attribute inspector

enter image description here

现在你可以改变一切了:-)


9
投票

斯威夫特4+

tabBarController?.tabBar.items![1].title = "xx"

2
投票

在你的 viewController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
  //Here you are setting title

self.title = NSLocalizedString(@"Title", @"Title");

}
return self;
}

1
投票

这是更改选项卡栏的名称和图标图像的方法:

 self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Main Tab" image:[UIImage imageNamed:@"maintab.png"]] autorelease];

1
投票

您可能想在 UITabBarController::viewDidLoad 中执行此操作,在这种情况下您需要设置视图控制器的标题,因为此时选项卡栏项目当前为 0。 所以使用

[[self.viewControllers objectAtIndex:0] setTitle: @"Buga"];
[[self.viewControllers objectAtIndex:1] setTitle: @"Nuga"];

-2
投票

我正在使用 Xcode 版本 8.2.1 (8C1002),这对我有用:

enter image description here

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