为每行调用cellForRowAtIndexPath的原因是什么?

时间:2018-01-22 12:24:15

标签: ios uitableview cocoa-touch

我有一个tableview,我有20个原型单元格,tableview< strong>内容参数是动态原型

此时我只展示了一个原型细胞,但出于某种奇怪的原因 cellForRowAtIndexPath 正在调用两次

我已经完成了我的代码,我只打了一次 reloaddata

我无法弄清楚可能导致tableview两次调用 cellForRowAtIndexPath 的原因!

所以我一般都想知道什么和所有可能导致tableview为同一行多次调用 cellForRowAtIndexPath

更新

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

但仍有行数是一个

2 个答案:

答案 0 :(得分:2)

如果您自己明确地致电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())

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

答案 1 :(得分:0)

默认情况下,在初始化视图控制器时会有一个调用,当你添加另一个时再重新加载tableView,那么它就是