ios滚动后保持UITableViewCell布局

标签 ios uitableview swift

我有一个 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) 并尝试在单元格内使用 prepareForReuselayoutSubviews 方法,但也没有帮助。

此外,有些单元格实际上会随机更改为“已添加”状态。如果我在 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/

相关文章:

ios - 不在 Xamarin 的 UIViewController 上调用 dealloc

ios - 为什么我的 UITableViewCell 指示空值

ios - 防止 UITableViewCells 出队和重新加载

ios - 类型不符合协议(protocol)序列类型 - Swift

ios - 以编程方式将一个 viewController 变量传递给另一个 Controller 时出错

ios - 从类实现时 UIButton 不可单击

Javascript延迟关闭IOS上的数字键盘

ios - 升级到 iOS8 后,UITableView didSelectRowAtIndexPath 不工作

swift - Finder 同步扩展无法从桌面读取/写入文件

ios - 如何在 SwiftUI 中进行异步更新后解雇发布者?