我正在对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:)
何时获得正确的值(单元格)。
答案 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是调用它的那个,否则它不是显示的那个。