【问题标题】:navigationController.navigationItem vs navigationItemnavigationController.navigationItem 与 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指向我想要的吧?

【问题讨论】:

    标签: ios uinavigationcontroller uinavigationitem


    【解决方案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 不会被放到另一个导航控制器中,所以设置导航控制器的这个属性通常是没有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多