滚动后ios保持UITableViewCell布局

时间:2015-03-29 08:52:22

标签: ios uitableview swift

我有一个UITableView,其数据来自web api(也是分页和可搜索的)。每个单元格都是我制作的自定义UITableViewCell,包含一个数据对象。该单元有两种状态,正常和添加。

普通有一个"添加"用于将数据对象添加到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(),但我猜这个单元格是在将其返回到" normal"之后绘制的。州。 由于这没有帮助,我去设置了一个布尔值(setToAddedState)并尝试在单元格中使用prepareForReuselayoutSubviews方法,但也没有帮助。

此外,一些细胞实际上改变为"添加"状态但随机。如果我在prepareForReuse内打印dataObject,它会正确打印。所以我唯一缺少的是如何让单元格显示正确的状态。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这里有一些你遗漏的东西:

首先,你必须记住dequeueReusableCellWithIdentifier:就是这么做的。它重用了已经创建的单元格。如果单元格不处于您希望的状态(即添加),则需要确保它在显示之前处于此状态。

其次,如果您查看prepareForReuse

的文档
  

在从UITableView方法dequeueReusableCellWithIdentifier返回对象之前调用此方法:

这意味着在prepareForReuse中检查出队后设置一个标志为时已晚。应使用prepareForReuse将单元格重置为默认状态。

最后,如果您的单元格需要设置任何特定的变量状态 - 无论是数据,布局,样式等 - 您应该在代理的tableView:cellForRowAtIndexPath:实现中执行此操作。

在您的代码中,您可以设置"添加"正如您尝试的那样,直接来自tableView:cellForRowAtIndexPath:的状态和单元格布局。设置标志不是这样做的方法。您的单元格应该有一个setAdded:方法,它会立即显示添加的状态,您的moveCellToRight方法也应该按照您希望的方式布置单元格。没有必要设置动画,因为此时细胞不可见。

另外,调用一种方法来设置tableView:cellForRowAtIndexPath:的单元格布局并不愚蠢,这正是你应该做的!

相关问题