如何使UIViewController包含更加容易

希望你们中的大多数人熟悉Container View Controller的概念。 这是一个非常有用的Cocoa功能,我发现自己最近越来越多地使用它。 不过,由于您可以在Apple的文档中找到它,因此我将不介绍其实现细节。

让我们深入研究一些我认为超级有用的场景。

  1. 嵌入UITableViewController 。 每个人都去过那里。 您有一张桌子,周围还有一些其他内容。 大多数人只是将UITableView添加到其UIViewController子类中。 但是通过这种方式,您将放弃通过UITableViewController免费获得的许多功能,例如:
  • 自动滚动到聚焦的UITextFieldUITextView以便它们不会隐藏在键盘后面
  • 默认的UITableViewDatasourceUITableViewDelegate实现
  • 完美无瑕的提拉精神

仅举几例。 如果将UITableViewController放入容器中,您将获得两全其美的UIViewController –您自己的UIViewController子类的灵活性,用于装饰内容和UITableViewController内置功能

2.共享的屏幕部分-出现在应用程序不同部分的屏幕部分。 如果使用CleanSwift体系结构,这将特别有用。 您可以轻松重用完整的场景,并且已经设置了他们的所有助手(交互器,路由器,工作程序)。

3.显示错误和场景的空状态。

4.将其用于控制​​器动画,因为与使用View Controller Transitions的UIViewController相比,使用UIViewPropertyAnimatorUIGestureRecognizer UIView动画更容易。 像使用其他视图一样,使用嵌入式控制器创建容器视图并对其进行动画处理。 您可以在DisplayInDrawer lib中看到这种方法。

在许多其他情况下, UIViewController包含可以简化程序员的生活。 但是–有一个警告。 假设您有一个嵌入式UITableViewController 。 您刚得到数据,因此创建了一个控制器,注入了数据,将其嵌入并显示。 到目前为止,一切都很好。 新数据到来。 在许多项目上,我多次看到使用相同的例程。 “因此您创建了一个控制器 ,注入了数据,……”。 错了 。 尽管已经有一个控制器,但您无需实例化它。 除非这样做可能很昂贵( viewDidLoad往往很忙,对吗?),否则您可能会引入疯狂的错误,例如注册重复的观察者,完成处理程序等。如果您的控制器分配不正确,这会变得更糟。 尽管我确定您的控制器确实会释放 👮,但由于您进行了仔细检查,不是吗?

解决方案是每次检查控制器是否已经存在,以及是否存在,只需注入数据即可。 不要创建新实例。

但这会变得很乏味,您很容易忘记进行此检查。

输入UIViewController-DisplayChild扩展名,该扩展名通过嵌入(显示) 类型而不是instance来缓解此问题。 您为它提供控制器的类型 ,配置闭包和容器视图。 该扩展程序决定是否需要实例化控制器,如果需要,则创建一个实例,在其上运行配置闭包,并将其嵌入到指定的容器视图中。