UIViewController和UITableViewController有什么区别

问题描述 投票:11回答:3

有时我想将UIViewController子类化为一些应用程序范围的自定义。例如。所有视图控制器应在viewDidLoad或viewWillAppear左右执行的操作。

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

所以我也是UITableViewController的子类,只是在那里做同样的事情。在OOP术语中,这似乎不是最聪明的事情。而且没有多重继承等。

因为UITableViewController继承自UIViewController ......

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

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

所以尽管有明显的东西,UITableViewController还有什么奇迹需要处理吗?

ios cocoa-touch uiviewcontroller uitableview
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:这样,如果用户点击导航栏中的“编辑”|“完成”按钮,控制器将切换表格的编辑模式。

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

一般来说,我发现最好自己实现这些行为,以便允许你注意到的备用继承层次结构,因为我通常会考虑将表视图的delagatedatasource设置为视图控制器的设计气味。这些是独立的问题,通常可以并且应该由其他类(例如,特定模型类的专用数据源)处理,而不是膨胀视图控制器。


3
投票

所以尽管有明显的东西,UITableViewController还有什么奇迹需要处理吗?

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

Apple's class documentation几乎说UITableViewController所做的一切(我不会在这里重复,因为它可能会在未来发生变化)。有时,可以从类的头文件中收集其他信息,但在UITableViewController.h的情况下,源代码注释只是重复类docs中已有的内容。

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


0
投票

看来UITableViewController会处理很多管理问题,如果你愿意的话,你可以为自己做些什么。查看the documentation - 它将自动为您创建一个UITableView,重新加载它等。

© www.soinside.com 2019 - 2024. All rights reserved.