ios developer documentation -- UIViewController

UIViewController

管理UIKit应用程序的视图层次结构的对象。

概述

UIViewController类定义了所有视图控制器共有的公共行为。 你很少直接创建UIViewController类的实例。 相反,您继承UIViewController并添加管理视图控制器的视图层次结构所需的方法和属性。

视图控制者的主要职责包括以下内容:

  1. 更新视图的内容,通常是为了响应底层数据的变化。
  2. 响应用户与视图的交互。
  3. 调整视图大小并管理整个界面的布局。
  4. 在您的应用程序中与其他对象(包括其他视图控制器)协调。


视图控制器与其管理的视图紧密绑定,并参与处理其视图层次结构中的事件。具体来说,视图控制器是UIResponder对象,并被插入到视图控制器的根视图和视图的父视图之间的响应器链中,视图的父视图通常属于不同的视图控制器。如果没有任何视图控制器的视图处理事件,则视图控制器可以选择处理事件或将它传递给超级视图。视图控制器很少单独使用。 相反,您经常使用多个视图控制器,每个视图控制器都拥有应用程序用户界面的一部分。例如,一个视图控制器可能会显示一个项目表,而另一个视图控制器显示该表中的选定项目。通常,一次只能看到一个视图控制器的视图。视图控制器可以呈现不同的视图控制器以显示新的视图集合,或者视图控制器可以充当其他视图控制器的内容和动画视图的容器,如果它想这么做的话。

子类笔记

每个应用程序至少包含一个UIViewController的自定义子类。 更经常地,应用包含许多自定义视图控制器。自定义视图控制器定义了您应用的整体行为,包括应用的外观以及它如何响应用户交互。以下部分简要介绍了您的自定义子类执行的一些任务。 有关使用和实现视图控制器的详细信息,请参阅适用于iOS的View Controller编程指南。

扫描二维码关注公众号,回复: 945024 查看本文章

view管理

每个视图控制器管理视图层次结构,其中的根视图存储在此类的视图属性中。根视图主要充当视图层次结构其余部分的容器。 根视图的大小和位置由拥有它的对象决定,它是父视图控制器或应用程序的窗口。窗口拥有的视图控制器是应用程序的根视图控制器,其视图大小可以填充窗口。视图控制器以懒方式地加载他们的视图。 第一次访问视图属性加载或创建视图控制器的视图。 有几种方法可以为视图控制器指定视图:

  1. 在应用程序的Storyboard中指定视图控制器及其视图。Storyboard是指定视图的首选方式。 通过Storyboard,您可以指定视图及其与视图控制器的连接。 您还可以指定视图控制器之间的关系和节点,这可以更轻松地查看和修改应用程序的行为。要从Storyboard加载视图控制器,请调用相应UIStoryboard对象的instantiateViewControllerWithIdentifier:方法。 Storyboard对象创建视图控制器并将其返回给您的代码。
  2. 使用Nib文件指定视图控制器的视图。 nib文件允许您指定单个视图控制器的视图,但不允许您定义视图控制器之间的渐变或关系。 nib文件也只存储关于视图控制器本身的最少信息。要使用nib文件初始化视图控制器对象,请以编程方式创建视图控制器类,并使用initWithNibName:bundle:方法对其进行初始化。 当请求视图时,视图控制器从nib文件加载视图。
  3. 使用loadView方法指定视图控制器的视图。 在该方法中,以编程方式创建视图层次结构,并将该层次结构的根视图分配给视图控制器的视图属性。


所有这些实现方式都有相同的最终结果,即创建适当的视图集并通过视图属性公开它们。

重要:视图控制器是其视图和它创建的任何子视图的唯一所有者。 它负责创建这些视图并在适当的时候放弃它们的所有权,例如视图控制器本身被释放时。 如果使用storyboard或nib文件来存储视图对象,当视图控制器访问它们时,每个视图控制器对象都会自动获取它们自己的这些视图的副本。 但是,如果您手动创建视图,则每个视图控制器都必须具有自己独特的一组view。 您不能在视图控制器之间共享view。

视图控制器的根视图始终大小适合其分配的空间。 对于视图层次结构中的其他视图,请使用Interface Builder指定自动布局约束来控制每个视图在其超级视图范围内的定位和大小。您也可以编程创建约束,并在适当的时候将它们添加到视图中。 有关如何创建约束的更多信息,请参阅自动布局指南。

处理与view相关的通知

当其视图的可见性发生更改时,视图控制器会自动调用其自己的方法,以便子类可以响应该更改。使用像viewWillAppear这样的方法:准备您的视图出现在屏幕上,并使用viewWillDisappear:保存更改或其他状态信息。 使用其他方法进行适当的更改。图1显示了视图控制器视图的可能可见状态以及可能发生的状态转换。 并非所有'将'回调方法都只与'did'回调方法配对。 您需要确保如果您使用'will'回调方法启动流程,则可以在相应的'did'和相反的'will'回调方法中结束流程。

图1,有效的状态转换


处理视图旋转

从iOS 8开始,所有旋转相关的方法都被弃用。 相反,旋转视为视图控制器view大小的变化,因此使用viewWillTransitionToSize:withTransitionCoordinator:方法进行通知。当界面方向改变时,UIKit在窗口的根视图控制器上调用该方法。 该视图控制器然后通知其子视图控制器,在整个视图控制器层次结构中传播消息。

在iOS 6和iOS 7中,您的应用支持在应用的Info.plist文件中定义的界面方向。 视图控制器可以覆盖supportedInterfaceOrientations方法以限制支持的方向列表。通常,系统仅在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕; 子视图控制器使用父视图控制器为其提供的窗口部分,不再直接参与有关支持哪些旋转的决策。应用程序的'定向遮罩和视图控制器'的定向遮罩的交集用于确定视图控制器可以旋转到哪个方向。

您可以覆盖旨在以特定方向全屏显示的视图控制器的preferredInterfaceOrientationForPresentation。

当可见视图控制器发生旋转时,将在旋转期间调用willRotateToInterfaceOrientation:duration:,willAnimateRotationToInterfaceOrientation:duration:和didRotateFromInterfaceOrientation:方法。viewWillLayoutSubviews方法也在视图调整大小并由父级定位后调用。 如果在发生方向更改时视图控制器不可见,则不会调用旋转方法。但是,视图变为可见时,将调用viewWillLayoutSubviews方法。 此方法的实现可以调用statusBarOrientation方法来确定设备方向。

笔记:在运行时,应用程序应始终以纵向方式设置其界面。 应用程序:didFinishLaunchingWithOptions:方法返回后,该应用程序使用上述视图控制器旋转机制在显示窗口之前将视图旋转到适当的方向。

实现试图控制器的嵌套

一个自定义的UIViewController子类也可以充当一个视图控制器的容器。 容器视图控制器管理其拥有的其他视图控制器(也称为其子视图控制器)的内容的呈现。 子试图控制器的视图可以按原样或与容器视图控制器拥有的视图一起呈现。

您的父viewcontroller子类应该声明一个公共接口来关联其子viewcontroller。 这些方法的性质取决于您,并取决于您创建的容器的语义。 您需要决定视图控制器一次显示多少个子viewcontroller,显示这些子viewcontroller时以及他们出现在视图控制器的视图层次结构中的位置。 你的视图控制器类定义了什么关系,如果有的话,由子viewcontroller共享。 通过为你的容器建立一个干净的公共接口,你可以确保子viewcontroller在逻辑上使用它的能力,而不必访问太多关于父viewcontroller的私人细节。

在将子viewcontroller的根视图添加到父viewcontroller之前,您的父viewcontroller必须将子viewcontroller与其自身相关联。 这允许iOS将事件正确地路由到子viewcontroller以及管理的视图。 同样,在从父viewcontroller中移除子viewcontroller后,它会将该子viewcontroller与其自身断开连接。 为了建立或者中断这些关联,你的容器调用由基类定义的特定方法。 这些方法不打算由您的容器类的客户端调用; 它们只能在您的容器的实施中使用,以提供预期的遏制行为。

以下是您可能需要调用的基本方法:


addChildViewController:


removeFromParentViewController


willMoveToParentViewController:


didMoveToParentViewController:

笔记:在创建容器视图控制器时,您不需要覆盖任何方法。默认情况下,旋转和外观回调会自动转发给子viewcontroller。 您可以选择重写shouldAutomaticallyForwardRotationMethods和shouldAutomaticallyForwardAppearanceMethods方法来自己控制此行为。

内存管理

内存是iOS中的关键资源,视图控制器提供内置支持以减少关键时刻的内存占用。 UIViewController类通过其didReceiveMemoryWarning方法提供了一些自动处理低内存条件的方法,该方法不需要释放。

状态的保存和恢复

如果您为视图控制器的restoreIdentifier属性赋值,系统可能会要求viewcontroller在应用程序转换到背景时对其进行编码。 保留时,视图控制器会保留视图层次结构中任何视图的状态,该视图也具有恢复标识符。 视图控制器不会自动保存任何其他状态。 如果您正在实现自定义容器视图控制器,则必须自己编码任何子视图控制器。 您编码的每个都必须具有唯一的恢复标识符。

有关系统如何确定要保留和恢复的视图控制器的更多信息,请参阅iOS应用程序编程指南。



猜你喜欢

转载自blog.csdn.net/yx1166/article/details/80056004