Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS如何调用委托和数据源方法?_Ios_Swift_Uitableview - Fatal编程技术网

iOS如何调用委托和数据源方法?

iOS如何调用委托和数据源方法?,ios,swift,uitableview,Ios,Swift,Uitableview,例如,当我们创建tableview时,我们需要一些数据源方法,如 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return messageArray.count } 我哪儿也不叫这个。然而,iOS代替了我,我想知道iOS是怎么做到的 iOS搜索tableview,如果它在视图上可用,则调用委托和数据源方法,或者在声明uiTableVie

例如,当我们创建tableview时,我们需要一些数据源方法,如

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return messageArray.count
    }
我哪儿也不叫这个。然而,iOS代替了我,我想知道iOS是怎么做到的

iOS搜索tableview,如果它在视图上可用,则调用委托和数据源方法,或者在声明
uiTableView.delegate=self
uiTableView.datasource=self
时调用它。
另一个是在
viewdiload?

之前调用的方法,因此快速查看这一点的方法是将这两件事分开

首先让我们看一下代理

委托提供了一组方法,您可以在代码中包含这些方法,这些方法为uitableview提供回调,以根据tableView中发生的情况执行某些协议定义的方法

示例
func tableView(UITableView,heightForRowAt:IndexPath)

此示例允许uitableview询问您如何在此当前位置显示某个单元格

接下来让我们看看数据源

Datasource的工作方式与委托类似,但提供了一组不同的方法来帮助您填充表视图

示例
func numberOfSections(在:UITableView中)
Apple的uitableview将调用此方法,并询问tableview我应该显示多少节


最终,这些只是允许tableview与您的代码交互并帮助您使用配置显示表的协议

tableView:numberOfRowsInSection
uitableview数据源
协议的方法。数据源的方法由
UITableView
的方法
reloadData()
调用

根据
UITableView
的文档:

UITableView重写UIView的layoutSubviews()方法,以便 仅在创建UITableView的新实例时调用reloadData() 或者在分配新数据源时。重新加载表视图将清除 当前状态,包括当前选择。然而,如果你 显式调用reloadData(),它将清除此状态和任何后续状态 对layoutSubviews()的直接或间接调用不会触发重新加载


一般来说,这是带有委托的类的设置:

class SimpleTableView {
    var delegate: SimpleTableViewDelegate?
    // ...
    func renderCell(at row: Int) { // called whenever the table needs to render a cell
        let cell = SimpleTableViewCell()
        cell.frame.size.height = delegate?.tableView(self, cellHeightForRow: row)
        // continue rendering cell
    } 
}
协议
SimpleTableViewDelegate
包含委托方法。它看起来像这样:

protocol SimpleTableViewDelegate {
    func tableView(_ tableView: SimpleTableView, cellHeightForRow: Int) -> CGFloat 
}
所以我们这里有一个类,
SimpleableView
,它从某处(视图控制器)获取数据。这就是代理如何发挥作用:

class ViewController: UIViewController, SimpleTableViewDelegate {
    var tableView = SimpleTableView()

    override func viewDidLoad() {
        tableView.delegate = self
    }

    func tableView(_ tableView: SimpleTableView, cellHeightForRow: Int) -> CGFloat {
        return 44
    }
}
这本质上就是委托的工作方式,这就是真正的
tableView
所做的。您可以设置
tableView
委托,并且
tableView
调用委托方法以从您那里获取信息


希望这有助于向您解释该代表在这里是如何工作的,什么叫它,以及通常发生了什么。如果您需要澄清,请毫不犹豫地询问

多谢各位。所以当我设置tableView.delegate=self时,delegate被称为right?@John,delegate只是一个对象,一个变量。当tableView需要来自视图控制器的信息(如单元格高度)时,它会调用委托上的相应方法。