【问题标题】:What are the reasons for cellForRowAtIndexPath getting called more than once for every row每行多次调用 cellForRowAtIndexPath 的原因是什么
【发布时间】:2018-07-01 01:59:29
【问题描述】:

我有一个 tableview,我有 20 个原型单元格,tableview 的 Content 参数是 Dynamic Prototypes

一次我只显示一个原型单元格,但出于某种奇怪的原因,cellForRowAtIndexPath调用了两次

我已经检查了我的代码,我只调用了一次 reloaddata

我不知道是什么原因导致 tableview 调用 cellForRowAtIndexPath 两次!

所以我通常想知道什么以及所有可能导致 tableview 为同一行多次调用 cellForRowAtIndexPath

更新:

如果单击一个按钮,则在其中一个原型单元格中,我可能会重新加载数据,以便我可以显示其他一些原型单元格,然后它也会被调用两次

但行数仍然是一

【问题讨论】:

  • 你能发布你的代码吗?
  • 没有看到你的代码是不可能的。
  • 代码这么大!让我一会儿更新你
  • 我可以鼓励您将所有UITableViewController 代码分解到一个单独的项目中。在那里单独测试它,如果可以的话,在那里验证它。
  • @DanRam 找到原因了吗?

标签: ios uitableview cocoa-touch


【解决方案1】:

如果你自己明确地调用reloadData(),那就可以解释了。 tableView 默认在UITableViewController 中加载数据,因此再次显式调用它会第二次触发cellForRowAt。您可以通过删除对reloadData() 的显式调用轻松确认这一点 - 然后tableView 应该看起来正确并且cellForRowAt 应该只调用一次。

我在 Playgrounds 中测试了以下最小工作示例,它只被调用了一次:

import UIKit
import PlaygroundSupport

class A: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Reload", style: .plain, target: self, action: #selector(buttonPressed))
    }


    @objc func buttonPressed() {
        tableView.reloadData()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print(">>>> calling numberOfRowsInSection")
        return 1
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        print(">>>> \(indexPath)")
        return UITableViewCell()
    }

}

PlaygroundPage.current.liveView = UINavigationController(rootViewController: A())

因此,除非您执行其他操作,否则每个 reloadData() 应该只调用一次 cellForRowAt

【讨论】:

  • @DanRam 执行以下操作:print(">> Begin") 然后tableView.reloadData() 然后print(">> End")... 在cellForRowAt 添加此行:print(">>>> \(indexPath)").. 然后显示打印的输出
  • @DanRam 兄弟有消息吗?
  • 正如你所说,我正在使用 tableviewcontroller 但第一次调用 reloaddata。在 viewdidload .. 导致 cellForRowAtIndexPath 被调用两次,这是有道理的,因为它的 tableviewcontroler 并且它会自己调用一次,如果我们显式调用,那么它将使 tableview 再次加载,这是有道理的但是......当一个按钮被点击并且我用 reloaddata 手动加载表格以便我可以加载其他一些单元格但这次 cellforRowIndexpath 不应该被调用两次但它被调用两次我不明白这个......跨度>
  • @DanRam 关注我之前的评论,让我知道发生了什么
  • 它的打印方式是“>>Begin”,然后是“>>End”,然后是 0,然后是 0
【解决方案2】:

默认情况下,当你添加另一个视图控制器时,会调用重新加载 tableView,然后它是 2

【讨论】:

  • 一个在视图 didload 上,其他在 tableviewcells 的按钮触发事件上
  • 您在单元格按钮操作中使用委托或如何从单元格按钮调用重新加载???
  • 我用过addTarget
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
相关资源
最近更新 更多