UIViewController 和 UITableViewController 有啥区别

Posted

技术标签:

【中文标题】UIViewController 和 UITableViewController 有啥区别【英文标题】:What is the difference between UIViewController and UITableViewControllerUIViewController 和 UITableViewController 有什么区别 【发布时间】:2013-06-25 19:20:33 【问题描述】:

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

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

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

并且作为 UITableViewController 继承自 UIViewController ...

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

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

那么,尽管有明显的东西,UITableViewController 有什么奇迹吗?

【问题讨论】:

感谢所有回答的人。这对特定的架构决策有很大帮助。 【参考方案1】:

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

【讨论】:

谢谢。听起来可行,而且对未来的项目也是一个很好的投资。您是否知道任何可以替代 UITableView 的好代码示例? @Jonah 你如何手动实现 UIViewController 中的最后三个项目符号(即每次显示 table view 时清除选择,在 table view 出现时闪烁​​ table view 的滚动指示器,并实现超类方法setEditing:animated: o 切换表格的编辑模式)?目前,当我返回 tableview 时,我的单元格保持突出显示,滚动条不会闪烁,并且按下 Edit 按钮完全没有任何作用(它甚至不会将按钮的文本更改为 Done)。您能否通过链接或如何执行这些操作的说明来编辑您的答案? @golddove 我不愿意提供跳过理解手头问题的解决方案,所以我不确定代码示例在这里是否有用。如果我不确定如何实现闪烁滚动指示器,我可能会先查看UITableView 的类文档,它没有提供任何直接的解决方案,但我认为它是更通用的UIScrollView 的子类。 UIScrollView 有一个 flashScrollIndicators 方法。在控制器的 viewDidAppear 中调用该方法会重现在 UITableViewController 中看到的行为。 是的,但是界面生成器/NIB/故事板呢?我已经尝试过他们提到的内容,但它崩溃了。【参考方案2】:

那么尽管有明显的东西,UITableViewController 有什么奇迹吗?

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

“UITableView 处理了很多管理问题” - 我想你的意思是 UITableViewController?此外,作者指出,他的意思是“除了显而易见的东西”。

以上是关于UIViewController 和 UITableViewController 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

在 xcode 4.2 中将 UITableViewController 转换为 UIViewController

将表格视图设置为编辑模式

如何立即设置CustomTableView(CoreData)

@synthesize IBOutlet 属性

Tableview单元格快速折叠和扩展值

从 UITableView 的子类访问 UIScrollViewDelegate