假设您有 3 个表格视图。适用于狗、猫和鸟。点击每个单元格将显示一个带有放大照片的新屏幕。
要设计这个,您需要为狗、猫和鸟提供 3 个独立的数据源。你基本上需要三个数组。
但是,您不需要 3 个 tableview 代表。因为表格视图的行为都是一样的。他们都只是呈现一个 viewController 并用 UIImage 填充它。仅当您的委托以通用方式编写时才适用,即委托中没有特定于狗、猫或鸟的代码。
话虽如此,您可以从数据源中抽象出狗、猫、鸟,但我的回答只是一个人为的例子。一些自定义对象过于复杂,无法使用相同的结构,因此需要有 3 个数据源。
旧答案:
在回答问题之前,您必须更好地了解委托设计模式:
让我从一个问题开始:
默认情况下,TableView 是这样的:
UITableView 如何知道要呈现多少个单元格?在每个单元格中呈现什么?
- 它自己不知道。
- 它要求另一个类通知它自己的单元格数量和返回什么单元格(什么单元格图像、单元格标题、单元格子标题等)值。您通常会在 ViewController(委托类)中看到一个 tableView(委托类)
- 一个班级要求另一个班级的这种概念称为委托!
现在您知道什么是委托,回答 OP 的实际问题:
这主要是语义差异的巨大问题。
如果您只是使用(而不是创建自己的协议)基金会的委托和数据源,那么这对您来说真的没关系。但是,如果您打算编写自定义协议,那么理解它们将帮助您更好地编写(并且具有更高重要性的读取,折射)代码。
从开发人员的角度来看,它们都处理委托ing类和委托类之间的交互。
Data Source
数据源几乎与委托相同。区别在于
与委托对象的关系。而不是成为
用户界面的委托控制,数据源被委托
数据的控制。委托对象,通常是视图对象,例如
作为表视图,保存对其数据源的引用,偶尔
询问它应该显示的数据。数据源,如
代表,必须采用协议并至少实现所需的
该协议的方法。数据源负责管理
它们赋予委托视图的模型对象的内存。
通俗地说:
DataSource 主要处理什么,并且通常是在初始化时。
代表主要处理如何和feeds你一些参数来给出某种行为,即如果用户点击这个......会发生什么?如果他们刷卡了……会发生什么?
以tableView为例:
数据源
它里面有什么?我要呈现什么样的细胞? cellForRowAtIndexPath.
部分的标题是什么? titleForHeaderInSection
它们有多少个细胞? numberOfRowsInSection
因此,您通常 返回 值。对于代表来说,void 类型更为常见。
数据源方法
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell // return a cell ie UITableViewCell
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int // return a number ie an Int
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? // return the title ie a String
委托方法
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
func tableView(tableView: UITableView, willBeginEditingRowAtIndexPath indexPath: NSIndexPath)
func tableView(tableView: UITableView, didEndEditingRowAtIndexPath indexPath: NSIndexPath)
我显然是有选择地选择了一些数据源方法不返回而一些委托方法确实返回
委托
完成页脚显示后我应该做什么/应该使用什么“行为形式”,你想让我弹出警报吗?didEndDisplayingFooterView
我是否要使用为单元格提供一些额外功能的附件类型? accessoryTypeForRowWithIndexPath