如何获取 UIViewController 的标题 UILabel

lea*_*ner 4 uilabel ios ios7

以下不起作用

UILabel *titleLabel = (UILabel *)self.navigationController.navigationItem.titleView;
Run Code Online (Sandbox Code Playgroud)

或者

UILabel *titleLabel = (UILabel *)self.navigationItem.titleView;
Run Code Online (Sandbox Code Playgroud)

两者都返回零。

是的,有问题的标题在导航栏中。目标很简单:我想要 UILabel。可以做到吗?

更新

其中的原因,我需要的UILabel是这样我就可以抓住它的宽度我写好文字之后,这将从根本上告诉我的标签的最大宽度(基本测量设备无关的方式:是否的iPad,iPhone等) .

Cab*_*bus 6

简短的回答:你不能。UINavigationBar的内部处理 aUIViewController的标题的显示。的titleView属性UINavigationItem用于其他目的。

长答案

查看UINavigationBar.h并粗略了解它们是如何协同工作的。- 您很快就会明白为什么 titleView 与 viewController 的标题无关。

UINavigationItem是 a 的数据源UINavigationBar。它保存了每个 的 barButtonItems、标题和标题视图UIViewController。查看UIViewController (UINavigationControllerItem)定义的类别,在UINavigationController.h那里的评论中有一个很好的解释。

UINavigationBar另一方面,是“只是”显示的内容UINavigationItems。当你将一个 viewController 推送到一个 navigationController 的堆栈上时, navigationController 会隐式调用UINavigationBar: pushNavigationItem:animated:它的 navigationBar,发送UINavigationItem你正在推送的 viewController 的 。

我看到你和我开始研究 UINavigationControllers 时有同样的误解:

你可以在UILabel *titleLabel = (UILabel *)self.navigationController.navigationItem.titleView;没有任何警告的情况下写东西的事实是非常具有误导性的

UINavigationController没有UINavigationItem. 它永远不会有。这是因为一个 navigationController 永远不会包含在另一个 navigationController 中。(如果您尝试在 IB 中构建此容器,我认为它会给您一个警告!?)您可以调用的原因self.navigationController.navigationItem是我上面提到的类别为每个属性提供UIViewController了一个UINavigationItem属性。UINavigationController反过来是一个UIViewController,因此从它自己的实现中的类别接收属性。- 这太令人困惑了!

我假设您想获取对titleLabel(即使您不能!)的引用,因为您想设置标题的字体或文本颜色。如果是这样,您可以通过UINavigationBar: setTitleTextAttributes:.

如果你想使用一个完整的定制titleview的,你是断创造一个更好的UILabel和它分配给titleView的属性UINavigationItem