我有一个 UITableView
,其中包含从网络 API 获取的数据(它也是分页和可搜索的)。每个单元格都是我制作的自定义 UITableViewCell
并包含一个数据对象。单元格有两种状态,正常和添加。
Normal 有一个“添加”按钮,用于将数据对象添加到 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()
,但我猜单元格是在以“正常”状态返回此处后绘制的。
由于这没有帮助,我去设置了一个 bool 值 (setToAddedState) 并尝试在单元格内使用 prepareForReuse
和 layoutSubviews
方法,但也没有帮助。
此外,有些单元格实际上会随机更改为“已添加”状态。如果我在 prepareForReuse
中打印 dataObject,它会正确打印。所以我在这里唯一缺少的是如何使单元格显示正确的状态。
在此先感谢您的帮助。
最佳答案
这里有一些你遗漏的东西:
首先,您必须记住 dequeueReusableCellWithIdentifier:
就是这样做的。它重用已经创建的单元格。如果单元格未处于您希望的状态(即已添加),您需要确保它在显示之前处于此状态。
其次,如果您查看prepareForReuse
的文档
this method is invoked just before the object is returned from the UITableView method dequeueReusableCellWithIdentifier:
这意味着在出队后设置标志以在 prepareForReuse
中进行检查将为时已晚。 prepareForReuse
应用于将单元格重置为其默认状态。
最后,如果您的单元格需要设置任何特定的变量状态 - 无论是数据、布局、样式等 - 您应该在委托(delegate)的 tableView:cellForRowAtIndexPath:
实现中执行此操作。
在您的代码中,您可以直接从 tableView:cellForRowAtIndexPath:
设置“已添加”状态和单元格布局,就像您尝试做的那样。设置标志不是这样做的方法。您的单元格上应该有一个 setAdded:
方法,它会立即显示添加的状态,并且您的 moveCellToRight
方法也应该按照您希望的方式立即对单元格进行布局。没有必要为此设置动画,因为此时单元格不可见。
此外,从 tableView:cellForRowAtIndexPath:
调用方法来设置单元格的布局并不愚蠢,这正是您应该做的!
关于ios滚动后保持UITableViewCell布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327270/