UIViewController和UITableViewController有什么区别

时间:2013-06-25 19:20:34

标签: ios cocoa-touch uiviewcontroller uitableview

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分: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按钮,控制器就会切换表格的编辑模式。

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

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

答案 1 :(得分:3)

  

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

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

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

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

答案 2 :(得分:0)

UITableViewController似乎可以解决很多管理问题,如果你愿意,你可以为自己做些什么。查看the documentation - 它会自动为您创建UITableView,重新加载等等。