使用UITableViewController相对于实现tableview delegate和datasource方法的UIViewController有哪些优势?

23
在Xcode中创建一个新的视图控制器来包含tableview时,有两个选项: 1. 创建一个新的UITableViewController 2. 创建一个实现UITableViewDelegate和UITableViewDataSource协议的新的UIViewController 假设我正确地实现了这些协议所需和可选的方法,除了不必编写方法存根之外,使用UITableViewController是否有任何优点?也就是说,UITableViewController类中是否实现了任何东西(内存管理,缓存等),使选项1比选项2更好?

UITableViewController的一个缺点是不能添加更多额外的东西,比如ADMOB横幅广告。 - M Hamayun zeb
5个回答

52

不管采取哪种方法,您都需要编写委托和协议方法。

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

  1. 您需要表格视图比视图控制器的视图小。
  2. 您需要向视图控制器添加不随表格视图滚动的其他视图(虽然可以使用UITableViewController解决此问题)。

以下是UITableViewController为您提供的所有功能,如果不使用UITableViewController,则需要复制这些功能:

  1. 定义并设置UITableView
  2. 将自身设置为表视图的dataSource和delegate。
  3. 覆盖setEditing:animated:方法以同时设置表视图的editing属性。
  4. 根据clearsSelectionOnViewWillAppear属性,在viewWillAppear:方法中取消选择上次选定的行。
  5. viewDidAppear:方法中闪烁表视图的滚动条。
  6. 连接刷新控件(从iOS 6开始)。
  7. 第一次出现时重新加载表视图。
  8. 调整表视图的contentInset(从iOS 7开始)。
  9. 在需要时滚动表视图,以使键盘出现。

4
谢谢,"需要复制的清单"远远超出了预期。 - Dan Rosenstark
UITableViewController 还负责调整表视图的 contentInset,并在键盘显示和隐藏时滚动第一响应者到视图中。 - rob mayoff
@robmayoff 说得好。不过当最初回答这个问题时,iOS 6 是最新版本,那时候没有任何东西会隐藏在导航栏和工具栏后面,所以 contentInset 当时并不适用。这在 iOS 7 中发生了改变。 - rmaddy
该列表仍未提及当键盘显示和隐藏时,contentInset将被调整。这使您可以在键盘弹出时滚动并查看表格底部。这与#8不同,后者涉及导航栏和工具栏,#9涉及激活文本字段。 - Janneman
我注意到触摸状态栏会将表格滚动到顶部。然而,普通的“UITableView”也会这样做,所以这并不算数。也许可以列出一些相同的事物的想法? - Janneman

13

零代码优势的键盘

UITableViewController 提供自动滚动功能,当屏幕键盘出现时,而常规的 UIViewController 没有此功能。

一个 UITableViewController 可以可靠地移动视图中的编辑区域,无需处理键盘通知。自 iOS 诞生以来,它一直如此,但键盘通知已经改变,很少提供向后兼容性。

每当一个视图需要编辑(例如登录界面),请考虑使用 UITableViewController 并在完全不需要编写任何代码的情况下利用这个独特的功能。

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

UITableViewController

iPhone OS的开始就可使用,到今天为止都适用。

► 在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。


真的吗?我正在使用UITableViewController,但自动滚动功能无法正常工作。底部的工具栏是否阻碍了这种神奇的功能呢? - Josh
如果UIToolBarUITableView层次结构内部,它就不会妨碍视图。如果您设法将工具栏附加到底部,则可能绕过了UITableViewController,因此出现了您报告的行为。尝试使用附加的项目并进行调整! - SwiftArchitect

5

UITableViewController 可以在 iOS5 上实现静态表格


这到底是什么意思? - Andrew Paul Simmons
1
你可以在IB中设计单元格并且不需要数据源。 - RolandasR

2

UITableViewController唯一与普通的UIViewController不同的地方就是它有一个tableView属性,并且它符合UITableViewDelegateUITableViewDataSource协议。正如RolandasR所指出的那样,将视图控制器设置为UITableViewController(或其子类)还允许您使用静态表格单元格。


2
使用UITableViewDelegate的主要优点是简单易用。然而,创建自己的TableViewController也有其优势,它不仅仅假定视图是表格:
1)您可以添加其他元素,并使表格占用屏幕的较小部分。 2)您可以添加一整套辅助方法,这些方法对从您的控制器派生的所有VC都可访问。我实现了一些辅助方法,以便在具有不同UITableViewCell类型时自动返回行高度,并自动注册各种单元格,以及从表格中的CGPoint获取单元格引用、下拉刷新回调等方法。
虽然您总是可以从UITableViewController派生并添加辅助方法,但我认为主要优点不是让表格占据整个视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接