我有一个UITableView包含从web api获取的数据(也可以分页和搜索)。每个单元格都是我创建的自定义UITableViewCell,包含一个数据对象。单元格有两种状态,正常和添加。
Normal有一个“add”按钮将数据对象添加到selectedObjects数组中。添加的模式是相似的,但内容被推到右边几个像素,以便显示一个“删除”按钮。
当我向数组中添加一个项时,我将设置单元格的动画以向右移动并显示“删除”按钮。现在我的问题是:
当我滚动(或进行新的搜索)时,我似乎不知道如何将单元格重置为“已添加”状态。
我试过的:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let myCustomCell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier", forIndexPath: indexPath) as MyCustomCell
    let dataObject = fromApiArray[indexPath.row]
    myCustomCell.dataObject = dataObject
    if selectedObjects.contains(dataObject) {
        myCustomCell.setToAddedState = true //flag to use inside the cell code in prepareForReuse or wherever I don't really know...
        myCustomCell.moveCellToRight() //just another way I tried. calling the method that animates the cell from the tableviewcontroller... (sounds silly I guess)
    }
    return myCustomCell
}

我试图调用单元格moveCellToRight(),但我猜单元格是在以“正常”状态返回此处后绘制的。
由于这没有帮助,我去设置了一个布尔值(setToAddedState),并尝试在单元格中使用prepareForReuselayoutSubviews方法,但也没有帮助。
此外,有些细胞实际上会随机地改变为“添加”状态。如果我在prepareForReuse中打印数据对象,它将正确打印。所以我唯一缺少的是如何使单元格显示正确的状态。
提前谢谢你的帮助。

最佳答案

这里有一些你遗漏的东西:
首先,你必须记住dequeueReusableCellWithIdentifier:就是这么做的。它重用已经创建的单元格。如果单元格未处于所需的状态(即已添加),则需要在显示之前确保其处于此状态。
其次,如果您查看prepareForReuse的文档
在从UITableView方法dequeueReusableCellWithIdentifier返回对象之前调用此方法:
这意味着在dequeing之后设置一个标记以签入prepareForReuse将太晚。prepareForReuse应用于将单元格重置为其默认状态。
最后,如果单元格需要设置任何特定的变量状态(无论是数据、布局、样式等),则应在委托的tableView:cellForRowAtIndexPath:实现中进行设置。
在您的代码中,您可以直接从tableView:cellForRowAtIndexPath:设置“added”状态和单元格布局。设旗不是办法。您的单元格上应该有一个setAdded:方法,该方法立即显示添加的状态,moveCellToRight方法还应该按照您希望的方式立即布局单元格。设置动画没有意义,因为此时单元格不可见。
另外,调用一个方法来设置tableView:cellForRowAtIndexPath:中单元格的布局也不是愚蠢的,这正是您应该做的!

10-08 01:02