简单的UIViewController状态机

如何轻松地在不同的视图之间切换

作为移动开发人员,我们非常普遍,必须实现某种内容视图(通常是列表),以显示必须从后端服务中获取的数据。 此外,通常还必须对某些错误或空视图的结果做出反应。

有了这个要求,在iOS开发之初,开发人员就习惯了与此非常类似的设置:

  • 一个UIViewController + UITableView来显示内容列表,并在等待时带有一个UIActivityIndicator
  • 表示错误状态的UIView
  • 另一个UIView表示空状态。

取得成功后,除了隐藏加载指示符之外,我们什么也不做。 但是,如果提取操作因错误而结束或返回空数据集,则我们将必须:

  1. 隐藏UITableView
  2. 创建要显示的错误或空白视图的实例,通常将列表视图控制器设置为其委托。
  3. 将子视图添加到列表视图层次结构中。

尽管这种方法没有错,但是就可伸缩性和维护而言,它并不是理想的处理方式:

  • 我们必须保持特定的逻辑,以确定何时显示或隐藏每个视图。
  • 如果有代表团要做,这也迫使我们将内容视图与其他视图结合起来。
  • 当添加新状态时,通常需要使用臭味的switch语句,这需要大量的工作。
  • 由于同时存在多个视图,因此具有更高的内存占用量。

幸运的是,iOS 5.0附带了一个新的API,可以将视图控制器作为其他视图控制器的子代来管理视图控制器,这使得我们可以做自己的容器视图控制器(例如本机UINavigationControllerUITabBarController等)并以更好的方式重用组件在视图生命周期方面,允许使用UIViewController实例组成复杂的视图。

在本文中,我将展示一种非常简单的方法来说明如何使用子级视图控制器对视图状态进行建模。