tableView.cellForRow(at :)和tableView.dataSource?tableView(tableView:cellForRowAt :)之间的区别

时间:2018-12-12 01:59:39

标签: ios swift unit-testing uitableview

我正在对tableView进行单元测试,以了解它是否呈现单元格。

我发现tableView.cellForRow(at:)返回nil,而tableView.dataSource?tableView(tableView:cellForRowAt:)返回正确的单元格。

这是我的单元测试代码。

it("renders one option text") {
    let indexPath = IndexPath(row: 0, section: 0)

    let cell = sut.tableView.dataSource?.tableView(sut.tableView, cellForRowAt: indexPath)

    let cell2 = sut.tableView.cellForRow(at: indexPath)

    expect(cell?.textLabel?.text).toEventually(equal("A1"))  // test suceeded
    expect(cell2?.textLabel?.text).toEventually(equal("A1")) // test failed
}

所以我很好奇这两种方法的区别。

Apple的文档说如果单元格不可见,tableView.cellForRow(at:)返回nil,所以我知道tableView.cellForRow(at:)在单元测试中返回nil, 但是我不确定两个方法的时间顺序 tableView.cellForRow(at:)何时获得正确的值(单元格)

2 个答案:

答案 0 :(得分:2)

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

此方法用于根据tableView的要求生成或出列单元格。这不是UITableView成员方法。相反,它是一个协议方法,另一个对象(它将是数据源)将实现并返回该值。因此无论我们是在进行单元测试还是在调试应用程序时,它将始终返回一个单元格。

tableView.cellForRow(at:) 

此方法不是生成器方法。它是UITableView的成员方法,例如作为实用程序方法。为了获得选择的行,我们使用tableView.selectedRow。因此,应该为任何indexPath返回单元格。

我们知道UITableView不会创建与绘制的行相等的单元格。假设您要绘制100行,那么UITableView仅创建几个额外的单元格(可见单元格除外)。因此,如果传递不在可见行中的任何indexPath,则实际上该单元格不存在。因为tableview正在等待您滚动和重用未使用的单元格。因此,无论您是进行单元测试还是在应用程序上工作,对于不可见的单元格始终显示为零。

答案 1 :(得分:1)

tableView.dataSource?tableView(tableView:cellForRowAt:)将始终使新单元出队。除非tableView是调用它的那个,否则它不是显示的那个。