首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tableView.dataSource?tableView(tableView:cellForRowAt:)与tableView.cellForRow(at:)的区别

tableView.dataSource?tableView(tableView:cellForRowAt:)与tableView.cellForRow(at:)的区别
EN

Stack Overflow用户
提问于 2018-12-12 01:59:39
回答 2查看 769关注 0票数 2

我正在对一个tableView进行单元测试,它是否呈现一个单元格。

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

这是我的单元测试代码。

代码语言:javascript
复制
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
}

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

苹果的文档说,如果单元格不可见,tableView.cellForRow(at:)返回零,所以我理解tableView.cellForRow(at:)在单元测试时返回零,但当得到正确的值( cell )时,我不确定这两种方法的时间顺序是

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-12 02:27:14

代码语言:javascript
复制
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

此方法用于根据tableView的要求生成或排列单元格。这不是UITableView成员方法。相反,它是一个协议方法,另一个作为数据源的对象将实现并返回该值。因此,无论是单元测试还是调试应用程序,它都会返回一个单元格。

代码语言:javascript
复制
tableView.cellForRow(at:) 

此方法不是生成器方法。它是UITableView的一个成员方法,是eg的一种实用方法。对于选择的行,我们使用tableView.selectedRow。因此,它应该返回任何indexPath的单元格。

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

票数 2
EN

Stack Overflow用户

发布于 2018-12-12 02:26:21

tableView.dataSource?tableView(tableView:cellForRowAt:)总是将一个新的单元格排出队列。除非tableView是那个叫它的,否则它不是正在展出的那个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53735018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档