故事板中的UIViewController标题属性
我通过Interface Builder / Storyboard设置UIViewController
的标题字段:
这个视图控制器嵌套在UINavigationController
中,而UINavigationController
又嵌套在UITabBarController
。 当我运行应用程序时,我的导航项目没有标题,标签栏项目也没有。
如果我明确地设置了视图控制器的导航项目的标题,也是界面生成器中的标签栏项目的标题,那么它工作得很好。
我想知道:
a)如果我没有使用Storyboard,而只是使用普通的xib ,那么设置视图控制器的标题会隐式地设置导航项目的标题以及标签栏项目的标题。 但这不是故事板 。 这是预期的行为?
b)视图控制器标题的目的是什么(在Storyboard中 )? 这似乎没有效果。
谢谢!
您可以通过双击实际的导航栏并在其中input标题来设置故事板中的UINavigationBar
的标题。 这只会设置UINavigationBar
的标题。
在代码中设置标题提供了一些不同的可能性。
self.title = @"Your title";
将设置一个导航条的标题,并且还会导致标题级联到UITabBarItem(如果存在)。
self.navigationItem.title = @"Your title";
将只设置navigationBar的标题,假设存在一个UINavigationController,而不会影响一个UITabBarItem。
self.navigationController.title = @"Your title";
将设置UITabBarItem的标题,但不是UINavigationBar。
步骤1
如果您在Xcode界面构build器中查看Xib,请查看“文档大纲”面板(左侧的第二个面板)。 展开您正在使用的视图控制器,直到find标有“导航项目”的图标。
第2步
如果您突出显示“导航项”并打开“实用程序”面板(最右侧),然后单击“属性”检查器,您将看到可以在哪里设置视图控制器的标题。 这是在Interface Builder中完成它的方法,而不是通过代码来完成。
今天早上我遇到了这个问题。 这是我采取的刺和最后的解决办法。
这正确地logging了故事板中设置的子视图控制器的标题,但是对呈现的内容没有影响:
- (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在从故事板加载之前拉取视图的标题,但直到属性设置之后才开始监听更改。 我不经常使用故事板或笔尖,所以很可能有一个神奇的checkbox用于隐藏某个我已经错过的地方。
无论如何,它看起来像你可以做self.navigationItem.title = self.title舞蹈,或上述,作为一种解决方法,仍然保持你的标题在IB。
苹果的文档是很清楚的:
导航控制器更新导航栏的中间位置,如下所示:
如果新的顶层视图控制器具有自定义标题视图,则导航栏将显示该视图来代替默认标题视图。 要指定自定义标题视图,请设置视图控制器的导航项目的titleView属性。
如果未设置自定义标题视图,则导航栏将显示包含视图控制器默认标题的标签。 这个标签的string通常是从视图控制器本身的title属性获得的。 如果要显示与视图控制器关联的标题不同的标题,请改为设置视图控制器的导航项目的标题属性。
强调我的。
我遇到了同样的问题。 我不明白为什么它不工作…它可能是故意的或只是一个错误。
要更改界面生成器中的标题,可以直接单击导航项目并在其中更改标题:
此页面上的其他内容都失败了。 现在,这个代码在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;
我认为它按照devise工作,但我们期望另一种行为。 如果你在– (void)viewDidLoad中打印标题属性,它将和你在故事板中设置的值相同,所以除非苹果select,否则我没有理由认为这是行不通的。
a)如果我没有使用Storyboard,而只是使用普通的xib,那么设置视图控制器的标题会隐式地设置导航项目的标题以及标签栏项目的标题。 但这不是故事板。 这是预期的行为?
我相信这是预期的行为。 我认为视图控制器的title
属性的目的更多的是可以由开发者自行决定使用的属性,以便区分控制器。
我认为这种改变的另一个原因是,您的导航项目的标题可能需要不同于标签栏标题,因为标签栏标题不能像导航标题一样长。
b)视图控制器标题的目的是什么(在Storyboard中)? 这似乎没有效果。
我想我在第一段中提到过这个问题。 我认为控制器的title
属性是开发人员可以用来区分控制器的属性。
我尝试了所有上述方法,甚至尝试手动添加导航栏,但无济于事。
所以这是对我有用的。
删除手动添加到视图控制器的任何导航栏项目,并将其添加到您的viewDidLoad
方法
self.navigationController.navigationBar.topItem.title = @"My Title";
要么
self.navigationController.topViewController.title = @"My Title";
在我的情况下,我解决这个问题:
[self.tabBarController.navigationItem setTitle:@"My Title"];
如果您有UINavigationItem
,则必须在故事板中使用导航项目标题。 如果您没有视图控制器的导航项目,那么UINavigationController
将使用视图控制器的title
属性。
例如:
在故事板中,如果您有导航项目,导航控制器不需要读取视图控制器的标题。 即使此导航项目的标题字段为空。
删除导航项目(如果可以的话,你将无法做到这一点的根视图控制器,但你会为其他人)和您的标题将被正确加载