与实现 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
来实现UITableViewDelegate
和UITableViewDataSource
协议
假设我正确实现了协议的所有必需和可选方法,使用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 并且自动滚动不起作用。底部的工具栏是否阻挡了这个神奇的功能? 如果UIToolBar
在UITableView
层次结构内,它就不会妨碍它。如果您设法将栏附加到底部,则您可能绕过了UITableViewController
,因此您报告的行为。尝试附加的项目并修改它!【参考方案3】:
UITableViewController
允许在 iOS5 上拥有静态表
【讨论】:
这是什么意思? 你可以在IB中设计单元格并且没有数据源【参考方案4】:UITableViewController
唯一具有/做常规 UIViewController
没有的事情是 tableView
属性,它符合 UITableViewDelegate
和 UITableViewDataSource
协议。 Ad RolandasR 指出,将视图控制器设置为 UITableViewController
的(后代)还可以让您使用静态表格单元格。
【讨论】:
【参考方案5】:使用 UITableViewDelegate 的主要优点是简单。但是,创建自己的不假定视图是表的 TableViewController 也有好处:
1) 您可以添加其他元素并使表格占据屏幕的较小部分。 2)您可以添加一大堆辅助方法,这些方法可供从您的控制器派生的所有 VC 访问。当我有不同的 UITableViewCell 类型时,我实现了帮助方法来自动返回行高,并自动注册各种单元格、从表格中的 CGPoint 获取单元格引用的方法、拉动刷新回调等。
虽然您始终可以从 UITableViewController 派生并添加辅助方法,但我认为主要优点是表格不会占据整个视图。
【讨论】:
以上是关于与实现 tableview 委托和数据源方法的 UIViewController 相比,使用 UITableViewController 有啥优势吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftBond 中使用 UITableview 数据源和委托?
如何使用不同的委托和数据源方法在一个类中实现两个Tableview?
由于 tableView 的委托实现而导致的遗留单元格布局[关闭]
在 ViewController 中设置了 TableView 的数据源和委托,但没有任何反应
UITableView 的数据啥时候加载?啥时间 tableview 调用它的委托方法。 viewWill 之后会出现吗?