tableView.cellForRowAtIndexPath(indexPath)返回nil

时间:2015-07-02 15:35:46

标签: swift tableview nsindexpath

我有一个循环通过我的表视图的验证函数,问题是它在某个时刻返回nil单元格。

for var section = 0; section < self.tableView.numberOfSections(); ++section {
    for var row = 0; row < self.tableView.numberOfRowsInSection(section); ++row {
        var indexPath = NSIndexPath(forRow: row, inSection: section)
        if section > 0 {
            let cell = tableView.cellForRowAtIndexPath(indexPath) as! MyCell
            // cell is nil when self.tableView.numberOfRowsInSection(section) return 3 for row 1 and 2
            // ... Other stuff
        }
    }
}

我不确定我在这里做错了什么,我尝试仔细检查indexPath行和部分它们很好,numberOfRowsInSection()返回3但是第1行和第2行返回一个nil单元格......我也可以在UI中看到我的3个单元格。

任何人都知道我做错了什么?

我的函数在一些tableView.reloadData()之后被调用,并且在viewDidLoad中,在我的函数执行事件之前,tableview可能没有完成重新加载,尽管我没有在dispatch_async中调用它吗? ?

希望得到答案。 提前谢谢

---------------------------答案------------------- -----

补充说明:

cellForRowAtIndexPath只返回可见单元格,验证应该在数据模型中完成。当细胞构建在

中时
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

它应该根据验证状态自行更改。

3 个答案:

答案 0 :(得分:13)

如文档中所述,cellForRowAtIndexPath返回:

  

表示表格单元格的对象,如果单元格不可见或indexPath超出范围,则为nil。

因此,除非您的表格完全显示,否则该方法返回的屏幕外行为nil

它为非可见单元格返回nil的原因是因为它们不存在 - 表重用相同的单元格,以最小化内存使用 - 否则将无法管理具有大量行的表。

答案 1 :(得分:0)

我也遇到了一个问题,即即使{em>完全可见,cellForRowAtIndexPath都返回零。就我而言,我在viewDidAppear()中调用调试功能(见下文),我怀疑UITableView尚未完全准备就绪,因为要打印的部分内容没有nil单元。 >

这就是我的解决方法:在viewController中,放置了一个将调用调试功能的按钮:

public func printCellInfo() {
    for (sectionindex, section) in sections.enumerated() {
        for (rowIndex, _) in section.rows.enumerated() {
            let cell = tableView.cellForRow(at: IndexPath(row: rowIndex, section: sectionindex))
            let cellDescription = String(describing: cell.self)

            let text = """
            Section (\(sectionindex)) - Row (\(rowIndex)): \n
            Cell: \(cellDescription)
            Height:\(String(describing: cell?.bounds.height))\n
            """

            print(text)
        }
    }
}
  

请注意,我使用的是我自己的数据结构:数据源是节的数组,每个节都包含一个行数组。你需要   进行相应的调整。

如果我的假设正确,那么您将能够打印所有可见单元格的调试说明。请尝试一下,让我们知道它是否有效。

答案 2 :(得分:0)

因此,要处理该错误,只需执行可选绑定:

// Do your dataSource changes above

if let cell = tableView.cellForRow(at: indexPath) as? MyTableViewCell {
    // yourCode
}

如果该单元格是可见的,则您的代码已应用或以其他方式应用,当在dequeueReusableCell方法中以cellForRowAt的形式出现在可见部分时,所需的Cell将重新加载。