繁体   English   中英

UIViewController和UITableViewController有什么区别

[英]What is the difference between UIViewController and UITableViewController

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

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

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

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

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

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

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

我相信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设置为视图控制器的设计气味。 这些是独立的关注点,通常可以并且应该由其他类(例如,特定模型类的专用数据源)处理,而不是膨胀视图控制器。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM