ViewController 编程指南官方文档笔记 ViewController programming guide
关于ViewController
ViewController顾名思义,用于控制内部的所有VIew。view controller 有几种类型,比如容器式:split view controller 多用于ipad,container view controller,navigation view controller等。这些容器式的,大部分都没有常见VC的功能逻辑,通过包含一个或者多个childviewcontroller 来实现。
viewcontroller 可保存和恢复他自己的状态。view controller在状态保存和恢复过程中起着重要作用。状态保存会在您的应用程序被挂起之前记录您的应用程序的配置,以便可以在后续应用程序启动时恢复配置。将应用程序恢复到之前的配置可以为用户节省时间并提供更好的用户体验。
保存和恢复的过程通常时自动的,但是你需要告诉iOS app的哪个部分需要保存。保存app的viewcontroller需要以下几步:
- 给viewcontrollers指定restoration identifiers
- 在运行时告诉iOS如何创建或者定位新的view controller
- 对于每个视图控制器,存储将视图控制器返回到其原始配置所需的任何特定配置数据
分配restoration identifiers 时,请记住,view controller 层次结构中的所有parent view controller 也必须具有restoration identifiers
。在保存过程中,UIKit从窗口的root viewcontroller 开始,并走向视图控制器层次结构。如果该层次结构中的视图控制器没有restoration identifiers
,则view controller 及其所有child view controller 和呈现的view controller 都将被忽略。
存储和恢复view controller小帖士
- 不必预存所有view controllers
- 在回复过程中避免swapping view controller。状态保存系统对它保存的视图控制器的类进行编码encode。在恢复过程中,如果您的应用程序返回的类不匹配(或不是原始对象的子类)的对象,则系统不会要求视图控制器decode任何状态信息。因此,swappng 完全不同的旧视图控制器不会恢复对象的完整状态。
- 状态保存系统希望你知道你对viewcontrller干了什么。恢复过程依赖view controller的包含关系来重建您的界面。如果您没有正确使用容器view controller,保存系统将找不到您的view controller。例如,除非在相应的view controller之间存在包含关系,否则绝不要在不同的视图中嵌入视图控制器的视图。
关于View Controller 的呈现/Presenting a View Controller
有两种显示viewcontrller的方法,嵌入container中或者present呈现之。
呈现和变换的过程
显示 present 一个viewcontroller,uikit定义了几个磨人的presentation style。比如,UIModalPresentationFullScreen, UIModalPresentationPageSheet, and UIModalPresentationFormSheet 等。
需要注意的是:当正在显示一个UIModalPresentationFullScreen 的 view controller时,UIKit 会移除底层 view controller的views(在动画后)。可以使用 UIModalPresentationOverFullScreen 属性来避免这个操作。在显示有透明区域的viewcontroller 时,使用此属性可以使底部的viewcontroll显示出来。
使用UIModalPresentationPopover风格在viewcontroller 中显示一个 popover view。通常用于显示一些附加的信息或列表。
使用UIModalPresentationCurrentContext 风格指定界面内的viewcontroller。
当使用这个风格的时候,你决定view controller覆盖那个vC(通过设置 definePResentationContext属性为YES)
注意: 和上面的viewcontroller会删除覆盖的底层 view 一样。通过使用 UIModalPresentationOverCurrentContext 风格来避免这个问题。
定义表示上下文的view controller也可以定义演示期间使用的转换动画。通常,UIKit使用呈现的view controller的modalTransitionStyle属性为屏幕上的view controller设置动画。如果表示上下文view controller的providePresentationContextTransitionStyle设置为YES,则UIKit将使用该view controller的modalTransitionStyle属性中的值。
自定义呈现的风格
使用 UIModalPresentationCustom 风格可以支持用自定义方式显示一个view controller。通过创建UIPresentationController的子类,实现她的方法和动画,设置位置和大小来显示一个view controller。UIPresentationController 还用于处理所显示的viewcontroller的traits发生变化的时的操作。
变换的风格 Transition Styles
transition style决定了现实一个presented viewcontrller的动画类型。可以通过赋值 modalTransitionStyle 属性来使用内建的磨人变换风格。 当呈现一个viewcontroller 的时候,UIKit 创建符合风格的动画。
当然也可以自定义这些变换的动画。
呈现View Controller VS 显示(showing) View Controller
UIViewController 类提供两种显示VC的方法:
- The showViewController:sender: and showDetailViewController:sender: 方法是最适用和累活的显示view controller 的方法。这两个方法让正在呈现的VC决定如何最佳的处理显示。比如:一个 ontainer view controller 可能把一个VC 作为一个Child VC “包含” 进来,而不是模态的显示她。默认行为是模态显示。
- The presentViewController:animated:completion: method 总是模态显示VC,
showViewController:sender:和showDetailViewController:sender:方法是发起呈现的首选方式。view controller可以在不知道视view controller层次结构的其余部分或当前view controller在该层次结构中的位置的情况下调用它们。这些方法还可以更轻松地在应用程序的不同部分重新使用view controller,而无需编写条件代码。
显示(showing) View Controller
必须先创建VC才能继续显示饿工作,必须设置modalPresentationStyle 属性,必须设置modalTransitionStyle属性来决定动画的风格,然后调用showViewController:sender或者showDetailViewcontroller:Sender方法。
UIKit将调用showViewController:sender:和showDetailViewController:sender:方法转发给相应的呈现VC。该VC可以决定如何最好地执行演示,并可根据需要更改演示文稿和转换样式。例如,导航VC可能会将VC推到其导航堆栈上。
使用Segues
使用segues来定义应用程序界面的流程。 segue定义了StoryBoard文件中两个视图控制器之间的转换。 segue的起点是启动segue的按钮,表格行或手势识别器。 segue的结束点是您想要显示的视图控制器。 Segue总是呈现一个新的视图控制器,但您也可以使用unwind segue来关闭视图控制器。
Segues 方法表格:
类型 | 行为 |
Show (Push) | 此segue使用目标VC的showViewController:sender:方法显示新内容。对于大多数VC,此segue在源VC上以模态方式呈现新内容。一些VC专门覆盖该方法并使用它来实现不同的行为。例如,导航VC将新视图控制器推到其导航堆栈上。UIKit使用targetViewControllerForAction:sender:方法来定位源视图控制器。 |
Show Detail (Replace) | 此segue使用目标VC的showDetailViewController:sender:方法显示新内容。此segue仅与嵌入在UISplitViewController对象内的VC相关。通过这个segue,SplitViewController用新内容替换其第二个子VC(detail controller)。大多数其他VC以模态方式呈现新内容。UIKit使用targetViewControllerForAction:sender:方法来定位源VC。 |
Present Modally | 模态方式显示 |
Present as Popover | popover 方式显示,但是会自带一些iOS的UI效果 |
创建一个unwind segue
unwind segues让你可以放弃已经呈现的视图控制器。通过将按钮或其他合适的对象链接到当前视图控制器的Exit对象,您可以在Interface Builder中创建。当用户点击按钮或与适当的对象进行交互时,UIKit会在视VC层次结构中搜索能够处理 unwind segue
对象。然后它关闭当前的VC和任何中间VC以显示 unwind segue 的destination 。
segue的生命周期
要了解segue如何工作,您需要了解segue对象的生命周期。 Segue对象是UIStoryboardSegue类或它的一个子类的实例。你的app不会直接创建segue对象;当一个segue被触发时,UIKit创建它们。以下是发生的情况:
- 要显示的VC已经创建和初始化
- segue对象被创建,她的initWithIdentifier:source:destination:方法呗调用。
- 正在显示的VC的prepareForSegue:sender方法被调用。
- segue对象的perform方法被调用。这个方法执行一个把VC带到屏幕的过度。
- 对segue对象的引用被释放。
end