38

我正在UIViewController通过Interface Builder/Storyboard设置标题字段: 在此处输入图像描述

此视图控制器嵌套在 aUINavigationController中,而后者又嵌套在UITabBarController. 当我运行应用程序时,我的导航项没有标题,标签栏项也没有。

如果我明确设置视图控制器的导航项的标题,以及它在界面构建器中的选项卡栏项的标题,那么它就可以正常工作。

我想知道:

a)如果我不使用Storyboard而只是常规xibs,设置视图控制器的标题会隐式设置导航项的标题以及选项卡栏项的标题。但它不是同一个故事板。这是预期的行为吗?

b)那么视图控制器标题(在Storyboard中)的目的是什么?它似乎没有效果。

谢谢!

4

10 回答 10

26

您可以UINavigationBar通过双击实际的导航栏并在此处输入标题来设置情节提要的标题。这仅设置UINavigationBar.

在代码中设置标题提供了一些不同的可能性。

self.title = @"Your title";将设置navigationBar 的标题并导致标题向下级联到UITabBarItem(如果存在)。

self.navigationItem.title = @"Your title";只会设置导航栏的标题,假设 UINavigationController 存在,并且不会影响 UITabBarItem。

self.navigationController.title = @"Your title";将设置 UITabBarItem 的标题,但不设置 UINavigationBar。

于 2013-09-24T16:02:23.567 回答
20

步骤1

如果您在 Xcode 的 Interface Builder 中查看 Xib,请查看“文档大纲”面板(左起第二个面板)。展开您正在使用的视图控制器,直到找到一个标记为:导航项的图标。

显示导航项的文档大纲面板

第2步

如果您随后突出显示 Navigation Item 并打开 Utilities 面板(最右侧),然后单击 Attributes Inspector,您将看到可以在哪里设置视图控制器的标题。这是在 Interface Builder 中执行此操作的方式,而不是通过代码执行此操作。

显示如何设置视图控制器标题的实用程序面板

于 2015-06-18T00:37:57.060 回答
3

我今天早上遇到了这个问题。这是我采取的措施和最终的解决方法。

这会正确记录情节提要中设置的子视图控制器的标题,但对呈现的内容没有影响:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"Title: %@", self.title);
}

这没有效果;标题仍然没有显示(可能是在执行“if (![_title isEqualToString:title]){}”用户引擎盖:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = [self.title copy];
}

这会导致正确设置标题:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *title = self.title;
    self.title = nil;
    self.title = title;
}

我的猜测是 UINavigationController 在从情节提要加载之前提取正在呈现的视图的标题,但是在设置属性之前不会开始监听更改。然而,我不经常使用故事板或笔尖,所以很可能有一个神奇的复选框隐藏在我错过的某个地方。

在任何情况下,看起来您都可以执行 self.navigationItem.title = self.title 舞蹈,或者上述方法,作为一种解决方法,并且仍然在 IB 中维护您的标题。

苹果的文档很清楚

导航控制器更新导航栏中间如下:

  • 如果新的顶级视图控制器具有自定义标题视图,导航栏将显示该视图以代替默认标题视图。要指定自定义标题视图,请设置视图控制器导航项的 titleView 属性。

  • 如果没有设置自定义标题视图,导航栏会显示一个包含视图控制器默认标题的标签。这个标签的字符串通常是从视图控制器本身的标题属性中获得的。如果要显示与视图控制器关联的标题不同的标题,请改为设置视图控制器导航项的标题属性。

强调我的。

于 2013-11-29T18:07:14.837 回答
2

我刚刚遇到了同样的问题。我不明白为什么它不起作用......它可能是故意的,或者只是一个错误。

要在界面生成器中更改标题,您可以直接单击导航项并在此处更改标题:

在此处输入图像描述

于 2014-07-26T14:41:57.980 回答
1

如果你有UINavigationItem出席,那么你必须使用故事板中的导航项标题。如果您没有视图控制器的导航项,UINavigationController则将使用视图控制器的title属性。

例子 : 这里有2个例子

在您的故事板中,如果您有导航项,则导航控制器不需要读取视图控制器的标题。即使此导航项的标题字段为空。

删除导航项(如果可以,您将无法为根视图控制器执行此操作,但您可以为其他人执行此操作)并且您的标题将被正确加载

于 2017-09-26T11:22:07.977 回答
1

此页面上的其他所有内容均失败。现在,这在代码中,在 viewDidLoad 中有效:

NSString* text = @"My page title";
UIFont* font = [UIFont systemFontOfSize:20.0];
const CGSize SIZE = [text sizeWithAttributes:@{NSFontAttributeName:font}];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SIZE.width, SIZE.height)];
label.text = text;
label.textColor = UIColor.blackColor;
self.navigationItem.titleView = label;
于 2016-11-22T07:23:04.263 回答
0

a) 如果我不使用 Storyboard 而只是使用常规 xib,则设置视图控制器的标题会隐式设置导航项的标题以及选项卡栏项的标题。但它不是同一个故事板。这是预期的行为吗?

我相信这是预期的行为。我认为title视图控制器的属性的目的更多是一种属性,可以由开发人员自行决定使用,也许是为了区分控制器。

我认为此更改的另一个原因是您的导航项的标题可能需要与标签栏标题不同,因为标签栏标题不能与导航标题几乎一样长。

b)那么视图控制器标题(在故事板中)的目的是什么?它似乎没有效果。

我想我在第一段中提到了这一点。我认为title控制器的属性是开发人员可以用来区分控制器的属性。

于 2013-09-30T14:27:24.493 回答
0

我认为它按设计工作,尽管我们期待另一种行为。如果您在- (void)viewDidLoad中打印 title 属性,它将与您在情节提要中设置的值相同,因此我认为除非 Apple 选择,否则我认为这没有任何原因不起作用。

于 2013-09-27T20:36:06.790 回答
0

就我而言,我解决了这个问题:

    [self.tabBarController.navigationItem setTitle:@"My Title"];
于 2016-02-17T00:42:02.113 回答
0

我尝试了以上所有方法,甚至尝试手动添加导航栏但无济于事。

所以这对我有用。

删除您手动添加到视图控制器的任何导航栏项目并将其添加到您的viewDidLoad方法中

self.navigationController.navigationBar.topItem.title = @"My Title";

或者

self.navigationController.topViewController.title = @"My Title";
于 2015-08-24T08:46:21.010 回答