11

有时我想继承 UIViewController 以进行一些应用程序范围的自定义。例如。所有视图控制器都应该在 viewDidLoad 或 viewWillAppear 期间执行的操作。

自然,我继承 UIViewController 并从那里开始,所有视图控制器都继承自那里。但是一些控制器运行表。并且有为此目的而设计的 UITableViewController。

所以我也继承了 UITableViewController 并在那里做同样的事情。用 OOP 术语来说,这似乎不是最聪明的事情。并且没有多重继承等。

由于 UITableViewController 继承自 UIViewController ...

现在我问自己为什么不创建自己的表格视图控制器,它继承自我自己的视图控制器子类并添加所有表格内容。但是什么是“所有餐桌上的东西”

  • xcode 为每个新的表视图控制器添加了框架代码。非常方便,但可以很容易地转移到代码片段中。
  • 有协议 UITableViewDelegate 和 UITableViewDataSource 的声明。随和。无论如何,这些方法的实现必须遵循 UITableViewController 的每个子类。
  • 协议中所有这些强制方法可能都有合理的默认实现。例如返回 0 为 numberOfSectionsInTableView: 或 nil 为 titleForHeaderInSection 或 44.0f 为 heightForRowAtIndexPath: (虽然不好的例子。完全不实现它可能更聪明)

因此,尽管有明显的东西,UITableViewController 是否有任何奇迹?

4

3 回答 3

11

我相信所有UITableViewController添加的行为都在类文档中得到了很好的定义:https ://developer.apple.com/documentation/uikit/uitableviewcontroller?language=objc

UITableViewController 类创建一个管理表视图的控制器对象。它实现了以下行为:

• 如果通过 initWithNibName:bundle: 方法(由超类 UIViewController 声明)指定 nib 文件,则 UITableViewController 加载存档在 nib 文件中的表视图。否则,它会创建一个未配置的 UITableView 对象,具有正确的尺寸和自动调整大小的掩码。您可以通过 tableView 属性访问此视图。

• 如果加载了包含表视图的 nib 文件,则数据源和委托将成为 nib 文件中定义的对象(如果有)。如果没有指定 nib 文件,或者 nib 文件没有定义数据源或委托,UITableViewController 将数据源和表视图的委托设置为 self。

• 当表格视图第一次加载时即将出现时,表格视图控制器重新加载表格视图的数据。每次显示表视图时,它也会清除其选择(有或没有动画,取决于请求)。UITableViewController 类在超类方法 viewWillAppear: 中实现了这一点。您可以通过更改 clearsSelectionOnViewWillAppear 属性中的值来禁用此行为。

• 当表格视图出现时,控制器闪烁表格视图的滚动指示器。UITableViewController 类在超类方法 viewDidAppear: 中实现了这一点。

• 它实现了超类方法setEditing:animated:,因此如果用户点击导航栏中的Edit|Done 按钮,控制器将切换表格的编辑模式。

如果它们适用于您的特定控制器和表格视图,所有这些行为应该很容易重新实现。

一般来说,我发现最好自己实现这些行为,以便允许交替继承层次结构,正如您所指出的,因为我通常认为将表视图的delagate和设置datasource为视图控制器是一种设计气味。这些是独立的问题,通常可以并且应该由其他一些类(例如,特定模型类的专用数据源)处理,而不是使视图控制器膨胀。

于 2013-06-25T20:31:05.337 回答
3

因此,尽管有明显的东西,UITableViewController 是否有任何奇迹?

不是我知道的。据我所知UITableViewController,主要是一个便利类,可以用您自己的添加几行代码的子类替换。

Apple 的类文档几乎说明了所有这些UITableViewController(我不会在这里重复,因为它可能会在未来发生变化)。有时,可以从类的头文件中收集到附加信息,但在UITableViewController.h源代码注释的情况下,只需重复类文档中已有的内容。

最后,您必须自己决定要在自己的子类中复制什么。也许您的项目不需要 .nib 处理?或者您的所有表格视图都不可编辑?所以只是不要编码...

于 2013-06-25T20:30:03.027 回答
0

如果您愿意,似乎可以UITableViewController解决许多您可以为自己做的管理问题。查看文档——它会自动为你创建一个UITableView,重新加载它,等等。

于 2013-06-25T20:26:42.260 回答