导航控制器详细分析

作者: 高手世界 | 来源:发表于2017-07-12 09:57 被阅读18次
    Snip20170712_3.png

    导航控制器几乎是我们开发中接触的最多的了,但是很多时候很多人还是总会把其中的 navigationBar , navigationItem 和 bar button item 等混淆,今天我们就来总结一下.

    1, UINavigationBar 和 UINavigationItem
    UINavigationBar:
    先看看开发文档对其的描述:
    原文

    The UINavigationBar class provides a control for navigating hierarchical content. It’s a bar, typically displayed at the top of the screen, containing buttons for navigating within a hierarchy of screens.The primary properties are a left (back) button, a center title, and an optional right button. You can use a navigation bar as a standalone object or in conjunction with a navigation controller object.

    翻译

    UINavigationBar类提供一种对导航层级内容的控制。它是一个栏,最典型的用法就是放在屏幕顶端,包含着各级视图的导航按钮。它最首要的属性是左按钮(返回按钮)、中心标题,还有可选的右按钮。你可以单独用导航栏,或者和导航控制器一起使用。

    UINavigationBar.png

    再来看看 UINavigationItem
    原文

    A UINavigationItem object manages the buttons and views to be displayed in a UINavigationBar object. When building a navigation interface, each view controller pushed onto the navigation stack must have a UINavigationItem object that contains the buttons and views it wants displayed in the navigation bar. The managing UINavigationController object uses the navigation items of the topmost two view controllers to populate the navigation bar with content.

    翻译

    一个UINavigationItem对象管理展示在导航栏上的按钮和视图。当创建一个导航界面的时候,每个压入导航栈中的视图控制器都需要一个navigation item,它包含了展示在导航栏上的按钮和视图。导航控制器利用最顶层的两个视图控制器的navigation item来提供导航栏的内容。

    实际上 navigationItem 是 navigationBar 的属性,navigationBar 可以说是一个容器, navigationItem 是布局在其内的,但是我们用纯代码的时候会发现,如下,

    困惑1.png

    貌似 navigationController 也有 navigationItem 属性,这是怎么回事呢?

    事实上,UINavigationController 并没有 navigationItem 这个属性,但是 navigationController 继承于 viewController ,而 viewController 拥有 navigationItem 属性,但是如果你这样用,

    self.navigationController.navigationItem.title = @"篮球";

    是没有效果的,这是因为 UINavigationController 是一个 特殊的 视图控制器,他是视图控制器的容器,(类似的还有 UITabBarController 和 UISplitViewController ),不能把它当做一般的 viewControlelr 使用,

    但是,还有一个令人困惑的地方在于

    self.navigationItem.title = @"篮球火";

    困惑.png

    同样是对导航栏的操作,为什么一个在第一层级(UIViewController) ,另一个在其属性navigationController的层级,
    如前所述, navigationItem 是 UIViewController 的一个属性,开发者文档是这样描述的

    This is a unique instance of UINavigationItem created to represent the view controller when it is pushed onto a navigation controller. The first time the property is accessed, the UINavigationItem object is created. Therefore, you should not access this property if you are not using a navigation controller to display the view controller. To ensure the navigation item is configured, you can either override this property and add code to create the bar button items when first accessed or create the items in your view controller'€™s initialization code.

    Avoid tying the creation of bar button items in your navigation item to the creation of your view controller'€™s view. The navigation item of a view controller may be retrieved independently of the view controller'€™s view. For example, when pushing two view controllers onto a navigation stack, the topmost view controller becomes visible, but the other view controller'€™s navigation item may be retrieved in order to present its back button.

    The default behavior is to create a navigation item that displays the view controller'€™s title.

    翻译

    它是UINavigationItem一个独特的实例。当视图控制器被推倒导航控制器中时,它来代表这个视图控制器。当第一次访问这个属性的时候,它会被创建。因此,如果你并没有用导航控制器来管理视图控制器,那你不应该访问这个属性。为确保navigation item 已经配置,你可以在视图控制器初始化时,重写这个属性、创建bar button item。
    要避免在创建视图控制器的视图时,创建bar button item。视图控制器的这个属性——navigationItem,它的恢复(生命周期——作者注),可能独立于视图控制器的视图。为什么会这样?举例来说,当把两个视图控制器压到导航栈中,最顶层的视图控制器是可见的,但另一个视图控制器的navigation item 可能是活跃状态(此时,隐藏的视图控制器的视图肯定是不活跃的,所以,这个时候navigation item 是独立于视图控制器的视图的——作者注),因为它要呈现其返回按钮。

    默认行为是创建一个navigation item 来展示视图控制器的标题。

    总结一下,如果把导航控制器(navigationController)比作一个剧院,那导航栏(navigationBar)就相当于舞台,舞台必然是属于剧院的,所以,导航栏是导航控制器的一个属性。视图控制器(UIViewController)就相当于一个个剧团,而导航项(navigationItem)就相当于每个剧团的负责人,负责与剧院的人接洽沟通。显然,导航项应该是视图控制器的一个属性。虽然导航栏和导航项都在做与导航相关的事情,但是它们的从属是不同的。也就是说 导航栏 从属于 导航控制器, 导航项 从属于 视图控制器
    导航栏(navigationBar)相当于负责剧院舞台的布景配置,导航项(navigationItem)则相当于协调每个在舞台上表演的演员(bar button item,title 等等),每个视图控制器的导航项可能都是不同的,可能一个右边有一个选择照片的bar button item,而另一个视图控制器的右边有两个bar button item。

    参考文章

    相关文章

      网友评论

        本文标题:导航控制器详细分析

        本文链接:https://www.haomeiwen.com/subject/gfivhxtx.html