如何获得UIViewController的标题UILabel

时间:2014-08-08 21:22:44

标签: ios ios7 uilabel

以下不起作用

UILabel *titleLabel = (UILabel *)self.navigationController.navigationItem.titleView;

OR

UILabel *titleLabel = (UILabel *)self.navigationItem.titleView;

两者都返回nil。

是的,相关标题位于导航栏中。目标很简单:我想要UILabel 。可以这样做吗?

更新

我需要UILabel的一个原因是我可以在用文本填充之后抓住它的宽度,这实际上会告诉我标签的最大宽度(基本上是设备无关的方式)测量:iPad,iPhone等)。

2 个答案:

答案 0 :(得分:3)

简短的回答:你做不到。 UINavigationBar的内部处理显示UIViewController的标题。 titleView的{​​{1}}属性用于其他目的。

答案很长

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

UINavigationBar.hUINavigationItem的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;
}