以下不起作用
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等) .
简短的回答:你不能。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
| 归档时间: |
|
| 查看次数: |
2130 次 |
| 最近记录: |