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