iOS tableview单元格随机为空

时间:2015-12-10 14:13:15

标签: ios swift uitableview

Screenshot of weird behavior

屏幕截图说明相当不错。我有一个动态自定义单元格的tableview。如果设置了标签,我为要检查的单元格中的一个内容添加了println。我可以在调试日志中看到每个单元格都有其内容。仍然,在设备上随机有空单元格,这意味着没有内容出现的行正在发生很大变化。即使只是向上和向下滚动也会使第二行消失,但第三行会被填充。滚动再次转过来。如果我关闭应用程序并再次启动它,则每行都会正确填充。

以下是细胞生成的代码:

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

    // Return a count picker cell
    if countPickerTableRow == indexPath.row {

        ...
    }

    // Return a normal wish list entry cell
    else {

        let article = wishListEntries[indexPath.row]!
        let cell = tableView.dequeueReusableCellWithIdentifier("ArticleCell", forIndexPath: indexPath) as! WOSArticleCell

        // Correct the order in case a count picker cell was inserted
        var row = indexPath.row
        if countPickerTableRow != -1 && indexPath.row > countPickerTableRow {
            row--
        }

        cell.setThePreviewImage(UIImage(data: article.thumbnail))

        cell.setArticleName(article.name)
        cell.setArticleDescription(article.text)
        cell.setArticleNumber(article.number)
        cell.setArticleCount(article.count as Int)
        cell.setOrderInTable(row)
        cell.setTableViewController(self)

        cell.setNeedsDisplay()

        cell.setInputAccessoryView(numberToolbar) // do it for every relevant textfield if there are more than one

        println(String(indexPath.row) + " " + cell.nameLabel.text!)

        return cell
    }
}

在自定义单元格类中没有什么特别之处。只是标签的几个出口。

这是故事板的屏幕: Storyboard

任何人都可以帮我找出这里发生的事情吗?我无法找到调试日志可以输出单元格内容的原因,但设备无法呈现它们。

2 个答案:

答案 0 :(得分:1)

您应该更改代码的逻辑。如果PickerCell出现,只需调用reloadData()并重新加载tableview中的所有内容。如果您拥有的行数很少,这将不是一个问题,并且它不是一个昂贵的操作,因为您在显示期间没有进行任何繁重的计算。

如果由于您在PickerCell中所做的更改而只需要更新单个单元格,那么您应该调用reloadRowsAtIndexPaths:withRowAnimation:使用要更新的单元格的indexPath。

答案 1 :(得分:1)

您的问题与您的子类WOSArticleCell有关。你实现了prepareForUse()吗?如果你有,你是否将任何属性设置为nil?

UITableViewCell Class Reference

  

<强>讨论

     

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用性   identifier - 在返回对象之前调用此方法   来自UITableView方法dequeueReusableCellWithIdentifier:。对于   性能原因,你应该只重置那个单元格的属性   与内容无关,例如,alpha,编辑和选择   州。 tableView中的表视图委托:cellForRowAtIndexPath:   重复使用单元格时应始终重置所有内容。如果是细胞   对象没有关联的重用标识符,此方法是   不叫。如果重写此方法,则必须确保调用   超类实现。