离开屏幕时表格单元格极其怪异

时间:2016-01-02 06:51:07

标签: ios swift uitableview

这是非常奇怪的行为。首次加载表视图时,它看起来像这样:

enter image description here

现在,当我向下滚动然后向上滚动时,按钮会显示在之前没有按钮的单元格上!像这样:

enter image description here

我知道这与“这是UITableView的预期行为有关.UITableView的重点是排队所需的单元格并释放不需要管理内存的单元格”,如下所述发布:UITableView in Swift: Offscreen cells are not pre-loaded

这是我的代码:

var messages = [String]()

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CathyTaskLogTableViewCell

    if messages[indexPath.row] != "" {
        cell.messageButton.hidden = false
    }

    return cell
}

有人能解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

获得此结果的原因是因为UITableViewCell正在重复使用。

if messages[indexPath.row] != "" {
    cell.messageButton.hidden = false
}
else
{
    cell.messageButton.hidden = true
}

答案 1 :(得分:0)

您的问题有两种可能的解决方案:

  1. 始终设置hidden属性:

    cell.messageButton.hidden = messages[indexPath.row] != ""
    
  2. 在重用时重置单元的状态,这在表视图控制器中提供了确定性行为,而不会给控制器类增加单元应该执行的任务的负担。这可以通过覆盖prepareForReuse中的CathyTaskLogTableViewCell来完成。

    func prepareForReuse() {
        super.prepareForReuse()
        self.messageButton.hidden = true // or false, depending on what's the initial state
        // other stuff that needs reset
    }
    
  3. 使用当前代码时,messageButton只有在单元格在messages中找不到内容时才会被隐藏。因此,对于具有此按钮可见,已重复使用的单元格,现在对应于messages中没有对应单元格的单元格,该按钮将保持可见。