【问题标题】:How does iOS call delegates and datasource methods?iOS 如何调用委托和数据源方法?
【发布时间】:2018-01-19 19:42:06
【问题描述】:

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

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

我不会在任何地方调用它。但是,iOS 代替我这样做,我想知道 iOS 是如何做到这一点的?

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

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

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

    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 被调用了吗?
    • @John,delegate 只是一个对象——一个变量。当 tableView 需要来自视图控制器的信息(例如单元格高度)时,它会在委托上调用适当的方法。
    【解决方案2】:

    因此,快速查看此问题的方法是将这两件事分开。

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

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

    示例func tableView(UITableView, heightForRowAt: IndexPath)

    这个例子允许 uitableview 询问你应该如何在当前索引路径中显示某个单元格。

    接下来让我们看看数据源

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

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

    示例func numberOfSections(in: UITableView) 苹果的uitableview会调用这个方法,询问tableview应该显示多少个section。

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

    【讨论】:

      【解决方案3】:

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

      根据UITableView的文档:

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

      【讨论】:

        猜你喜欢
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-03
        • 1970-01-01
        • 2016-01-17
        • 2016-07-16
        相关资源
        最近更新 更多