Ios 为什么我必须将数据源和委托设置为self?

Ios 为什么我必须将数据源和委托设置为self?,ios,swift,uitableview,Ios,Swift,Uitableview,我正在学习swift,我所学的课程将教授桌面视图。我必须设置TableViewControllert包括UITableViewDataSource和UITableViewDelegate。然后,在viewDidLoad中,我必须设置 tableView.dataSource = self tableView.delegate = self 以使tableView显示并加载数据 为什么我必须这样做?必须设置数据源和视图委托才能使视图工作。这些对象不必是self(即控制器),它可以是其他对象(或两

我正在学习swift,我所学的课程将教授桌面视图。我必须设置
TableViewController
t包括
UITableViewDataSource
UITableViewDelegate
。然后,在
viewDidLoad
中,我必须设置

tableView.dataSource = self
tableView.delegate = self
以使tableView显示并加载数据


为什么我必须这样做?

必须设置数据源和视图委托才能使视图工作。这些对象不必是
self
(即控制器),它可以是其他对象(或两个其他对象,一个数据源和一个视图代理)


看起来您已经在控制器中实现了这两种方法,因此它可以充当所有三种方法(控制器、数据源、视图委托)。但是您仍然必须告诉视图有关它的信息。

设置
tableView.datasource=self
意味着从中调用它的类将充当
tableView
的数据源提供程序,并实现了为
tableView
提供数据以填充tableView的函数


这同样适用于
委托
委托
(self)类实现了在tableView上执行某些操作时将调用的函数,如在tableView的行中单击。

设置委托会在委托对象和类之间创建连接。委托对象处理表视图,并让类知道其完成时间。通过设置代理,可以调整tableview的行为

既然你说你在学习斯威夫特,我就想写一个口若悬河的回答。所有其他答案已经解释了为什么需要将委托设置为self或类的任何实例。但我还是想写下这个答案,只是为了给人更多的洞察力

让我解释一下什么是UITableViewDelegate和UITableViewDataSource。UITableViewDelegate和UITableViewDataSource都是协议。什么是协议?您可以将协议视为一组操作

例如,UITableViewDataSource有一组操作/方法,如 表格视图(:numberOfRowsInSection:)表格视图(表格视图:UITableView, cellForRowAtIndexPath:nsindepath)等等

此协议的含义是,如果要向tableview提供自定义数据,则需要遵守此协议,即实现协议的非可选方法(如果有可选方法,可以忽略)

类似地,UITableViewDelegate有一组方法,例如,tableView(\utableview:UITableView, 高度为rowAtIndexPath indexPath:NSIndexPath)tableView(tableView:UITableView, didSelectRowAtIndexPath:nsindepath)依此类推

UITableViewDelegate协议意味着,如果您希望在tableview中发生用户交互时(例如,当用户点击tableview的单元格时)收到通知,则需要遵守该协议

那么现在,你为什么要设定

tableView.dataSource = self
tableView.delegate = self
这是因为您正在ViewController、TableViewDatasource协议中实现协议(或遵守协议),以便向tableview、TableViewDelegate协议提供您自己的数据,以便在用户与tableview交互时通知ViewController类

实际上,您不会总是将协议一致性设置为self,您可以将其设置为实现协议的任何类的实例

希望这有帮助


有关协议的更多参考信息,请参阅以下内容:

我将对此进行详细解释。 这里,
UITableViewDataSource
UITableViewDelegate
实际上是协议。不幸的是,
UIKit框架
不是开源的。但我可以向你们保证,在参考了许多文章之后,这是内部发生的事情

协议就像篮球教练,里面有一些要求。他/她通过使用这些要求告诉玩家,比如类、结构、枚举
该做什么?
。但是他/她自己不知道怎么做。因此,符合该协议的类或结构应该在实现扣篮的同时提供这些需求的实现

protocol UITableViewDelegate {
 func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}
协议被称为数据源协议,然后它总是包含具有“返回类型”的必需函数,如下所示

protocol UITableViewDataSource {
 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
 func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
}
在自定义viewController中实现UITableView

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView = UITableView()    

    override func viewDidLoad {
      tableView.delegate = self
      tableView.dataSource = self
    }
这里,
tableView
充当委托人(发送者)和
viewController对象,即(自我)
充当委托人(接收者)

UITableView()
对象现在称为
tableView
UITableView()
类中有两个各自协议的可选存储属性作为type,现在由
tableView
作为

tableView.delegate: UITableViewDelegate?
tableView.dataSource: UITableViewDataSource?
为了在
viewController
中获取
UITableView
。它应该符合这两个协议。 因此,
viewController
class对象实现了这两个协议所需的所有功能。现在,
self
可以用作
UITableViewDelegate
类型或
UITableViewDataSource
类型,因为协议可以用作符合它的类的对象的类型。 现在,
tableView
的两个属性,即
delegate
dataSource
都被分配给
self
,因为它具有相同的协议类型

这两个协议的非可选功能在
viewController
类对象中实现,如下所示

协议
UITableViewDelegate
功能 协议
UITableViewDataSource
函数 1) 当用户在节中选择一行时,
tableview
(发送方),即
UItableView()
调用下面显示的
UITableViewDelegate
函数,方法是将数据传递给驻留在
viewController
ob中的参数
indexath
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
// Do further processes like pushing or poping another viewController
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
 }

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
 }
tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"

tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"