navigationController.navigationItem 与 navigationItem
Posted
技术标签:
【中文标题】navigationController.navigationItem 与 navigationItem【英文标题】:navigationController.navigationItem vs navigationItem 【发布时间】:2013-06-04 08:43:19 【问题描述】:只是好奇,为什么设置self.navigationItem = ...
有效,但self.navigationController.navigationItem
失败?这同样适用于self.toolbarItems
和self.navigationController.toobarItems
。
什么时候使用self.navigationController.navigationItem
?
也许你会说,它们指向不同的东西。但是为什么self.navigationController.navigationBarHidden = YES
导航栏是隐藏的。不是说self.navigationController.navigationItem
指向我想要的吧?
【问题讨论】:
【参考方案1】:类UIViewController
有一个属性navigationItem
。
无论是UICollectionViewController
、UITableViewController
、UINavigationViewController
还是任何自定义子类,所有子类也是如此。
当由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的主要内容,如果未能解决你的问题,请参考以下文章