有时我想将UIViewController子类化为一些应用程序范围的自定义。例如。所有视图控制器应在viewDidLoad或viewWillAppear左右执行的操作。
当然,我是UIViewController的子类,并从那里开始,所有视图控制器都继承自那里。但是一些控制器运行表。还有为此目的设计的UITableViewController。
所以我也是UITableViewController的子类,只是在那里做同样的事情。在OOP术语中,这似乎不是最聪明的事情。而且没有多重继承等。
因为UITableViewController继承自UIViewController ......
现在我问自己为什么我不只是创建自己的表视图控制器,它继承自我自己的视图控制器子类并添加所有表的东西。但什么是“所有的桌子”?
所以尽管有明显的东西,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:这样,如果用户点击导航栏中的“编辑”|“完成”按钮,控制器将切换表格的编辑模式。
所有这些行为都应该很容易重新实现,如果它们适用于您的特定控制器和表视图。
一般来说,我发现最好自己实现这些行为,以便允许你注意到的备用继承层次结构,因为我通常会考虑将表视图的delagate
和datasource
设置为视图控制器的设计气味。这些是独立的问题,通常可以并且应该由其他类(例如,特定模型类的专用数据源)处理,而不是膨胀视图控制器。
所以尽管有明显的东西,UITableViewController还有什么奇迹需要处理吗?
不是我知道的。据我所知,UITableViewController
主要是一个便利类,可以用你自己的子类替换,增加几行代码。
Apple's class documentation几乎说UITableViewController
所做的一切(我不会在这里重复,因为它可能会在未来发生变化)。有时,可以从类的头文件中收集其他信息,但在UITableViewController.h
的情况下,源代码注释只是重复类docs中已有的内容。
最后,您必须自己决定要在自己的子类中复制什么。也许您的项目不需要.nib处理?或者您的表格视图都不可编辑?所以只是不要编码......
看来UITableViewController
会处理很多管理问题,如果你愿意的话,你可以为自己做些什么。查看the documentation - 它将自动为您创建一个UITableView
,重新加载它等。