我有一个 TabBarController 设置为主控制器选项卡,其中名称是使用界面生成器定义的。现在我想以编程方式更改其名称。
怎么办?
已经有一段时间了,该线程上的所有历史记录仍然适用,并且相同的逻辑适用于 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") })
}
自从我最初的回答以来,发生了很多事情:Swift 3、故事板等。标题通常是所有视图共享的,可以在属性检查器中设置
此外,为了进行更多控制,您可以随时从设计器视图中拖动
UITabBarItem
和 UINavigationItem
元素。您必须将它们拖动到将在选项卡栏/导航控制器中显示的视图。基本上他们将信息存储为“我想像这样显示在标签栏中”。
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)
不幸的是,如果文件所有者是
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"];
您也可以使用导航项来完成此操作,但这需要更多的体操,超出了我的适应范围。
但是可以用代码来完成,最好直接在Storyboard中设置。怎么办?
只需点击相应的标签栏项目控制器内(不在标签栏控制器内)。
然后切换到
Utilities面板上的
attribute inspector
。
现在你可以改变一切了:-)
斯威夫特4+
tabBarController?.tabBar.items![1].title = "xx"
在你的 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;
}
这是更改选项卡栏的名称和图标图像的方法:
self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Main Tab" image:[UIImage imageNamed:@"maintab.png"]] autorelease];
您可能想在 UITabBarController::viewDidLoad 中执行此操作,在这种情况下您需要设置视图控制器的标题,因为此时选项卡栏项目当前为 0。 所以使用
[[self.viewControllers objectAtIndex:0] setTitle: @"Buga"];
[[self.viewControllers objectAtIndex:1] setTitle: @"Nuga"];