【问题标题】:tableView.cellForRowAtIndexPath(indexPath) return niltableView.cellForRowAtIndexPath(indexPath) 返回 nil
【发布时间】:2015-09-20 05:42:42
【问题描述】:

我有一个验证函数循环遍历我的表格视图,问题是它在某些时候返回 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 {

它应该根据验证状态改变自己。

【问题讨论】:

    标签: swift tableview nsindexpath


    【解决方案1】:

    如文档中所述,cellForRowAtIndexPath 返回:

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

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

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

    【讨论】:

    • 是的,但我没有隐藏任何单元格,在此过程中我所做的只是更改他们的背景颜色以帮助用户知道它是否有效......是否存在边缘情况我的牢房会在我不知情的情况下隐藏起来吗? reloadData() 会导致这种情况吗?有没有办法确保我的 tableview 在午餐验证之前完成渲染?
    • 你的意思是所有行都显示在屏幕上,不用滚动?
    • 不,有些单元格实际上不在屏幕上。我应该怎么做才能使我的验证工作?
    • 我想更改无效单元格的背景,有没有办法继续?
    • 我有一个案例,所有单元格都在屏幕上,但是 cellForRowAtIndexPath 确实返回 nil :-[[[[[
    【解决方案2】:

    我也遇到过cellForRowAtIndexPath 返回 nil 的问题,即使单元格完全可见。在我的例子中,我在 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)
            }
        }
    }
    

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

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

    【讨论】:

      【解决方案3】:

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

      // Do your dataSource changes above
      
      if let cell = tableView.cellForRow(at: indexPath) as? MyTableViewCell {
          // yourCode
      }
      

      如果单元格可见,则您的代码已被应用,否则,当在 cellForRowAt 方法中以 dequeueReusableCell 的形式进入可见部分时,所需的单元格将被重新加载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2011-05-06
        相关资源
        最近更新 更多