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

时间:2018-01-19 19:42:07

标签: ios swift uitableview

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

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return messageArray.count
    }

我不会在任何地方打电话。但是,iOS会这样做,而不是我,我想知道iOS是如何做到的?

iOS搜索tableview,如果它在视图中可用,则调用delegates和datasource方法,或者在我们声明uiTableView.delegate = selfuiTableView.datasource = self时调用它。 另一个是在viewDidLoad?

之前调用的这些方法

3 个答案:

答案 0 :(得分:0)

因此,快速查看此内容就是将这两件事分开。

首先让我们看一下委托 https://developer.apple.com/documentation/uikit/uitableviewdelegate

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

示例func tableView(UITableView, heightForRowAt: IndexPath)

此示例允许uitableview询问您如何在当前索引路径中显示某个单元格。

接下来让我们看一下数据源

https://developer.apple.com/documentation/uikit/uitableviewdatasource

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

示例func numberOfSections(in: UITableView) Apple的uitableview将调用此方法并询问tableview应显示多少部分。

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

答案 1 :(得分:0)

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

根据UITableView的文件:

  

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

答案 2 :(得分:0)

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

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调用委托方法以获取您的信息。

希望这有助于向您解释代表如何在这里工作,什么称呼它,以及一般情况下发生了什么。如果您需要澄清,请不要犹豫!