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