navigationController.navigationItem 与 navigationItem

Posted

技术标签:

【中文标题】navigationController.navigationItem 与 navigationItem【英文标题】:navigationController.navigationItem vs navigationItem 【发布时间】:2013-06-04 08:43:19 【问题描述】:

只是好奇,为什么设置self.navigationItem = ... 有效,但self.navigationController.navigationItem 失败?这同样适用于self.toolbarItemsself.navigationController.toobarItems

什么时候使用self.navigationController.navigationItem

也许你会说,它们指向不同的东西。但是为什么self.navigationController.navigationBarHidden = YES 导航栏是隐藏的。不是说self.navigationController.navigationItem指向我想要的吧?

【问题讨论】:

【参考方案1】:

UIViewController 有一个属性navigationItem

无论是UICollectionViewControllerUITableViewControllerUINavigationViewController 还是任何自定义子类,所有子类也是如此。

当由UINavigationController 呈现时,导航控制器将创建此属性,因此每个视图控制器都有自己的navigationItem。如果您不从导航控制器中显示它,则 navigationItem 为 nil。

现在,有了UINavigationController,您很有可能将其用作您的初始视图控制器。因此,导航控制器不会被另一个导航控制器呈现,其navigationItem 属性为 nil。

导航栏略有不同,因为这是以相反的方式管理的。

【讨论】:

“导航控制器将创建此属性,因此每个视图控制器都有自己的导航项”是否意味着 navigationItem 属性只能由父级设置?如果这是真的,为什么self.navigationController.navigationItem 结果为<UINavigationItem: 0x8044020> 不为零? 经过测试,原来self.navigationItem不会是nil,因为在init之后,在添加到navController之前self.navigationItem被设置了。 对不起,我的错误。虽然导航项是由当前可见的控制器而不是导航控制器拥有的,但这是真的。 请注意 Apple 的文档:“第一次访问该属性时,会创建 UINavigationItem 对象。因此,如果您不使用导航控制器来显示视图控制器,则不应访问此属性” 【参考方案2】:

虽然 set 可以设置导航控制器的这个属性:self.navigationController.navigationItem = .. 但它不起作用。 主要是因为 navigationItem 是 UIViewController 的属性。您可以访问该属性,因为 UINavigationController 继承自 UIViewController。此属性适用于添加到导航控制器中的任何视图控制器,以便为它们创建导航栏。通常一个 UINavigationController 不会被放到另一个导航控制器中,所以设置导航控制器的这个属性通常是没有意义的。

【讨论】:

以上是关于navigationController.navigationItem 与 navigationItem的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 LaunchScreen 导航控制器的色调颜色

iOS 8 -- 对导航栏和状态栏应用模糊