与实现 tableview 委托和数据源方法的 UIViewController 相比,使用 UITableViewController 有啥优势吗? [关闭]

Posted

技术标签:

【中文标题】与实现 tableview 委托和数据源方法的 UIViewController 相比,使用 UITableViewController 有啥优势吗? [关闭]【英文标题】:Are there any advantages to using a UITableViewController over a UIViewController that implements tableview delegate and datasource methods? [closed]与实现 tableview 委托和数据源方法的 UIViewController 相比,使用 UITableViewController 有什么优势吗? [关闭] 【发布时间】:2013-01-22 18:24:14 【问题描述】:

Xcode 中,当我创建一个新的视图控制器来包含一个表格视图时,我有两个选择

    创建一个新的UITableViewController 创建一个新的UIViewController 来实现UITableViewDelegateUITableViewDataSource 协议

假设我正确实现了协议的所有必需和可选方法,使用UITableViewController 有什么好处(除了不必编写方法存根)吗?意思是,UITableViewController 类中是否有任何东西(内存管理、缓存等)在幕后实现,使选项 1 比选项 2 更好?

【问题讨论】:

Uitableviewcontroller 的一个缺点是没有添加更多额外的东西意味着例如 1:ADMOB 横幅 【参考方案1】:

无论您采用两种方法中的哪一种,都必须编写委托和协议方法。

当您需要一个带有表格视图的视图控制器时,您应该选择使用UIViewController 而不是UITableViewController 只有两个可能的原因:

    您需要表视图小于视图控制器的视图。 您需要向视图控制器添加不随表格视图滚动的其他视图(尽管有一些方法可以通过 UITableViewController 解决此问题)。

以下是 UITableViewController 为您所做的所有您需要复制的事情:

    定义和设置UITableView。 将自身设置为表格视图的数据源和委托。 覆盖setEditing:animated: 方法以同时设置表格视图的editing 属性。 根据clearsSelectionOnViewWillAppear 属性取消选择viewWillAppear: 方法中最后选定的行。 在viewDidAppear: 方法中闪烁表格视图的滚动条。 连接刷新控件(从 ios 6 开始)。 在表格视图第一次出现时重新加载它。 调整表格视图的contentInset(从 iOS 7 开始)。 当键盘出现时,根据需要滚动表格视图。

【讨论】:

谢谢,“需要复制”的列表超出了范围。 UITableViewController 还处理调整表格视图的contentInset 并在键盘显示和隐藏时将第一响应者滚动到视图中。 @robmayoff 好点。虽然最初回答这个问题时,iOS 6 是最新的,当时导航栏和工具栏后面什么都没有,所以contentInset 当时不适用。这在 iOS 7 中发生了变化。 该列表仍然没有提到contentInset 在键盘显示和隐藏时得到调整。这使您可以在键盘打开时滚动到表格底部并查看表格底部。这与 #8 指的是导航栏和工具栏以及 #9 指的是激活文本字段不同。 我注意到触摸状态栏会将表格滚动到顶部。然而,一个普通的“UITableView”也会这样做,所以这不算数。也许是一个想法来列出相同的事物?【参考方案2】:

0 行代码的键盘优势

UITableViewController 在屏幕键盘出现时提供自动滚动,而普通的UIViewController 则不提供。

UITableViewController 可靠地在视图中移动编辑区域,无需摆弄键盘通知。自 iOS 诞生之日起,它就这样做了,而键盘通知发生了变化,很少提供向后兼容性。

每当需要编辑视图(如登录屏幕)时,请考虑使用 UITableViewController 并利用这一独特功能,只需 0 行代码

不幸的是,采用UITableViewDelegate 协议的常规UIViewController 确实提供该功能。

iPhone OS诞生到今天

► 在GitHub 上查找此解决方案,在Swift Recipes 上查找更多详细信息。

【讨论】:

真的吗?我正在使用 UITableViewController 并且自动滚动不起作用。底部的工具栏是否阻挡了这个神奇的功能? 如果UIToolBarUITableView 层次结构内,它就不会妨碍它。如果您设法将栏附加到底部,则您可能绕过了UITableViewController,因此您报告的行为。尝试附加的项目并修改它!【参考方案3】:

UITableViewController 允许在 iOS5 上拥有静态表

【讨论】:

这是什么意思? 你可以在IB中设计单元格并且没有数据源【参考方案4】:

UITableViewController 唯一具有/做常规 UIViewController 没有的事情是 tableView 属性,它符合 UITableViewDelegateUITableViewDataSource 协议。 Ad RolandasR 指出,将视图控制器设置为 UITableViewController 的(后代)还可以让您使用静态表格单元格。

【讨论】:

【参考方案5】:

使用 UITableViewDelegate 的主要优点是简单。但是,创建自己的不假定视图是表的 TableViewController 也有好处:

1) 您可以添加其他元素并使表格占据屏幕的较小部分。 2)您可以添加一大堆辅助方法,这些方法可供从您的控制器派生的所有 VC 访问。当我有不同的 UITableViewCell 类型时,我实现了帮助方法来自动返回行高,并自动注册各种单元格、从表格中的 CGPoint 获取单元格引用的方法、拉动刷新回调等。

虽然您始终可以从 UITableViewController 派生并添加辅助方法,但我认为主要优点是表格不会占据整个视图。

【讨论】:

以上是关于与实现 tableview 委托和数据源方法的 UIViewController 相比,使用 UITableViewController 有啥优势吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftBond 中使用 UITableview 数据源和委托?

如何使用不同的委托和数据源方法在一个类中实现两个Tableview?

:IOS Table表视图委托协议和数据协议

由于 tableView 的委托实现而导致的遗留单元格布局[关闭]

在 ViewController 中设置了 TableView 的数据源和委托,但没有任何反应

UITableView 的数据啥时候加载?啥时间 tableview 调用它的委托方法。 viewWill 之后会出现吗?