UINavigationController

439 阅读10分钟

官方文档地址

它是一个容器视图控制器,用于导航分层内容,基于堆栈方案来实现。


Declaration

@interface UINavigationController : UIViewController

Discussion

导航控制器是一种容器视图控制器,它在导航界面中管理一个或多个子视图控制器。在这种类型的界面中,同一时间只能看到一个子视图控制器。在视图控制器上点击一个条目,会在屏幕上跳转到一个新的视图控制器,并且带有动画效果,从而会隐藏之前的视图控制器。点击位于视图顶部的导航栏上的返回按钮,会移除掉位于上层的视图控制器,下层的视图控制器会显示出来。
使用导航界面模拟由您的应用程序管理的分层数据的组织。在层次结构的每一层,您提供一个适当的视图(由视图控制器管理)以显示该层的内容。图1显示了iOS模拟器中「设置」应用程序提供的导航界面示例。第一个页面向用户显示包含首选项的应用程序列表。选择一个应用程序会显示该应用的各个设置和设置组。选择一个组会产生更多设置,以此类推。对于除根视图以外的所有视图,导航控制器都提供一个后退按钮,以允许用户向上移动层次结构。 图1 导航界面示例 导航控制器对象使用有序数组(称为导航堆栈)管理其子视图控制器。数组中的第一个视图控制器是根视图控制器,它表示堆栈的底部。数组中的最后一个视图控制器是堆栈中最顶层的条目,代表当前正在显示的视图控制器。使用segues或这个类的方法从堆栈中添加和删除视图控制器。用户也可以使用导航栏上的返回按钮或左边缘的轻扫手势来删除最上方的视图控制器。导航控制器管理着位于页面顶部的导航栏和位于页面底部的工具栏(可选)。导航栏始终存在,并且由导航控制器本身进行管理,导航控制器使用其子视图控制器提供的内容更新导航栏。当toolbarHidden属性是NO时,导航控制器类似地使用最顶部视图控制器提供的内容更新工具栏。
导航控制器和它的委托对象一起协调它的行为,委托对象可以重写视图控制器的推入和弹出操作,提供自定义动画过渡,并且指定导航界面的首选方向。提供的委托对象必须要遵循UINavigationControllerDelegate协议。
图2展示了导航控制器和它管理的对象之间的关系,使用导航控制器的指定属性可以访问这些对象。 图2 导航控制器管理的对象

Navigation Controller Views

导航控制器是容器视图控制器,也就是说,它会将其他视图控制器的内容嵌入到自身当中。你可以通过它的view属性访问导航控制器的视图,该视图包括(incorprate)导航栏,一个可选的工具栏以及与最顶部视图控制器相对应的内容视图。图3显示了如何组装这些视图以显示整个导航界面(在该图中,导航界面进一步嵌入在标签栏界面内)。尽管导航栏和工具栏视图的内容会改变,但视图本身不会改变。实际更改的唯一视图是导航栈上最顶层视图控制器提供的自定义内容视图。 图3 导航控制器的视图

注意
由于内容视图在iOS7及更高版本中位于导航栏的下边,因此在设计视图控制器内容时必须考虑该空间。

导航控制器管理着导航栏和可选导航工具栏的创建,配置和显示。可以自定义导航栏的外观相关属性(appearance-related),但是绝不能直接更改它的frame,bounds或者alpha的值。如果将NavigationBar子类化,则必须使用initWithNavigationBarClass:toolbarClass:方法初始化导航控制器。要隐藏或显示导航栏,请使用navigationBarHidden属性或者setNavigationBarHidden:animated:方法。
导航控制器使用与导航栈上的视图控制器相关联的navigation item对象(UINavigationItem类的实例)动态构建导航栏的内容。要自定义导航栏的整体外观,请使用UIAppearance API,因此,要改变导航栏的内容,必须配置自定义视图控制器的导航项(navigation items),更多关于navigation items的信息,请参照UINavigationItem

Updating the Navigation Bar

每次顶级视图控制器更改时,导航控制器都会相应地更新导航栏。具体地说,导航控制器更新显示在三个导航栏位置(左,中和右)中每个位置上的栏按钮项。Bar button itemsUIBarButtonItem类的实例,你可以根据需要创建自定义内容的items或者创建标准系统items
给导航栏着色是由导航栏本身的属性来控制的,使用tintColor属性来改变导航栏上items的着色,使用barTintColor来改变导航栏本身的着色,导航栏不会从当前显示的视图控制器继承其色调颜色。
有关导航栏的更多信息,请参见UINavigationBar,有关如何创建bar button items的更多信息,请参见UIBarButtonItem

The Left Item

对于导航栈上除根视图控制器意外的所有视图控制器,导航栏左侧的item可以提供导航,回到前一个视图控制器。这个最左侧按钮的内容由以下几点来确定:

  • 如果新的顶级视图控制器具有自定义的左侧bar button item,则显示这个item,要指定自定义左侧bar button item,请设置视图控制器导航项的leftBarButtonItem属性。
  • 如果顶层视图控制器没有自定义的左侧bar button item,但是前一个视图控制器的导航项目的backBarButtonItem属性有值,导航栏将显示该项目。
  • 如果两个视图控制器中的任何一个都未指定自定义bar button item,则使用默认的返回按钮,它的标题设置为上一个视图控制器的title属性的值,即栈中下一层的视图控制器。(如果导航栈上只有一个视图控制器,则不会显示返回按钮)

注意
如果返回按钮的标题太长而无法容纳在可用空间内,则导航栏可能会用字符串“Back”代替实际的按钮标题,仅当上一个视图控制器提供了返回按钮时,导航栏才会执行此操作。如果新的顶层视图控制器有自定义的左侧bar button item(其导航项目的leftBarButtonItemleftBarButtonItems属性中的对象),则导航栏不会更改按钮的标题。

The Middle Item

导航控制器更新导航栏的中间部分,如下所示:

  • 如果新的顶层视图控制器有自定义的标题视图,导航栏会显示该视图以代替默认的标题视图。要指定自定义的标题视图,可以设置视图控制器导航项的titleView属性。
  • 如果没有设置自定义的标题视图,导航栏会显示一个包含视图控制器默认标题的label,该label的值通常从视图控制器本身的title属性获得,如果要显示与视图控制器相关联标题不同的标题,可以用设置视图控制器导航项的title属性来代替。
The Right Item

导航控制器更新导航栏的右侧部分,如下所示:

  • 如果新的顶层视图控制器有自定义的右侧bar button item,该item会被显示,要指定自定义的右侧bar button item,可以设置视图控制器的导航条目的rightBarButtonItem属性。
  • 如果没有指定自定义的右侧bar button item,导航栏在右侧不会显示任何东西。

Displaying a Toolbar

导航控制器对象在其视图层次结构中管理着一个可选的toolbar,当显示时,toolbar从激活视图控制器的toolbarItems属性中获取它当前items的集合,当激活视图控制器发生变化时,导航控制器会更新toolbat items以匹配新的视图控制器,并在适当的时候以动画形式将新items放到相应的位置。
toolbar默认是隐藏的,但是你可以调用导航控制器对象的setToolbarHidden:animated:方法,让它在导航界面显示。如果不是所有的视图控制器都支持toolbar items,则委托对象在后续的pushpop操作期间可以调用此方法来切换toolbar的可见性。使用自定义的UIToolbar子类,调用initWithNavigationBarClass:toolbarClass:来初始化导航控制器。如果使用自定义的toolbar和导航栏子类来创建导航控制器,请注意,在屏幕上显示导航控制器之前,你要负责pushingsetting视图控制器。

Adapting to Different Environments

导航界面在水平紧凑和水平常规环境中均保持不变,当在两种环境之间切换时,只有导航控制器的视图大小会改变,导航控制器不会更改其视图层次结构或视图布局。
在导航堆栈上的视图控制器之间配置segues时,标准的ShowShow Detailsegues的行为如下:

  • Show segue--导航控制器将指定的视图控制器push到导航堆栈。
  • Show Detail segue--导航控制器以模态的形式present指定的视图控制器。
    其他segue类型的行为没有变化。

Interface Behaviors

导航控制器的界面支持以下行为:

  • Supported interface orientations--确定支持的界面方向时,导航控制器对象不会在其导航堆栈上查询视图控制器,在iPhone上,导航控制器支持除纵向颠倒(portrait upside-down)外的所有方向,在iPad上,导航控制器支持所有方向,如果导航控制器有委托对象,则委托可以使用navigationControllerSupportedInterfaceOrientations:方法指定一组不同的受支持的方向。
  • Presentation context--导航控制器为模态呈现的视图控制器定义了presentation context,当模式转换样式为UIModalPresentationCurrentContextUIModalPresentationOverCurrentContext时,来自导航堆栈中视图控制器的modal presentations将覆盖整个导航界面。

State Preservation

当你将值设置给导航控制器的restorationIdentifier属性时,它会尝试将自身及其子视图控制器保留在其导航堆栈中,导航控制器从堆栈的底部开始,然后向上移动,对每个也具有有效restoration identifier字符串的视图控制器进行编码,在下一个启动周期中,导航控制器将保留的视图控制器按照相同的保留顺序恢复到导航堆栈中。
push到导航堆栈上的子视图控制器可能使用相同的restoration identifiers,导航控制器会自动存储其他信息,以确保每个子视图的回复路径都是唯一的。
关于状态的保存和还原是如何工作的更多信息,请参阅Preserving Your App's UI Across Launches