以下不起作用
UILabel *titleLabel = (UILabel *)self.navigationController.navigationItem.titleView;
OR
UILabel *titleLabel = (UILabel *)self.navigationItem.titleView;
两者都返回nil。
是的,相关标题位于导航栏中。目标很简单:我想要UILabel 。可以这样做吗?
更新
我需要UILabel的一个原因是我可以在用文本填充之后抓住它的宽度,这实际上会告诉我标签的最大宽度(基本上是设备无关的方式)测量:iPad,iPhone等)。
答案 0 :(得分:3)
简短的回答:你做不到。 UINavigationBar
的内部处理显示UIViewController
的标题。 titleView
的{{1}}属性用于其他目的。
答案很长
查看UINavigationItem
并粗略了解它们如何协同工作。 - 你很快就会明白为什么titleView与viewController的标题无关。
UINavigationBar.h
是UINavigationItem
的dataSource。
它包含每个UINavigationBar
的barButtonItems,title和titleView。
查看UIViewController
中定义的UIViewController (UINavigationControllerItem)
类别,在那里的评论中有一个很好的解释。
另一方面,UINavigationController.h
“只是”显示UINavigationBar
的内容。
当您将viewController推送到navigationController的堆栈时,navigationController会在其navigationBar上隐式调用UINavigationItems
,发送您正在推送的viewController的UINavigationBar: pushNavigationItem:animated:
。
我发现你和我开始深入研究UINavigationControllers时有同样的误解:
您可以在没有任何警告的情况下编写UINavigationItem
之类的内容,这是非常误导的
UILabel *titleLabel = (UILabel *)self.navigationController.navigationItem.titleView;
没有UINavigationController
。它永远不会有。
这是因为navigationController永远不会包含在另一个navigationController中。 (如果你试图在IB中构建这个包含,它会给你一个警告我认为!?)你可以调用UINavigationItem
的原因是我上面提到的类别给每个self.navigationController.navigationItem
一个{{1属性。 UIViewController
反过来是UINavigationItem
,因此在其自己的实现中从类别接收属性。 - 那太令人困惑了!
我假设您想要获取对UINavigationController
的引用(即使您不能!),因为您要设置标题的字体或文本颜色。如果是这样,您可以通过UIViewController
执行这些操作。
如果您想使用完整的自定义titleView,最好创建titleLabel
并将其分配给UINavigationBar: setTitleTextAttributes:
UILabel
属性
答案 1 :(得分:1)
这对我有用:
- (UILabel *)getNavBarTitleLabel
{
UINavigationBar *navBar = self.navigationController.navigationBar;
if (!navBar) { return nil; }
for (UIView *subview in navBar.subviews) {
for (UIView *subSubview in subview.subviews) {
if ([subSubview isMemberOfClass:[UILabel class]])
{
// consider adding more checks to verify that this UILabel is indeed the title label before returning it
// for example, if you know what the text should be you can compare the strings
return (UILabel*)subSubview;
}
}
}
return nil;
}