自定义 TableViewCell 按钮应该切换特定行的活动状态和图标,但它也会更改其他不相关行的图标

Custom TableViewCell Button should toggle active status and icon of a specific row, but it also changes the icon of other unrelated rows

我需要在包含自定义对象的tableView切换每个对象状态(active/inactive):我只想显示活动对象在那个 tableView 中,所以当一个对象的状态变为 inactive 时,它​​就会从列表中消失。

该应用正在运行(创建新的自定义对象,在 tableView 中显示它们,在 detailView 中查看和编辑它们的内容 - 包括 active/inactive 状态...);如果相关,请考虑 我的项目使用核心数据 并且我使用它的方法来填充 tableView.

我还需要 tableView 单元格的自定义设计,我已经实现了(我有 UITableViewCell 子类和显示所需内容的自定义单元格) 这似乎也有效,但这是我第一次使用自定义单元格,我一定做错了什么......

当我点击单元格中的活动-非活动按钮以更改自定义对象状态时(并使其从列表中消失,因为它已变为非活动状态),我实际上得到了我想要的那个对象(它的状态改变并且对象从列表中消失)。

我的问题是我还看到其他几行的 UIButton 图像(当对象处于活动状态或非活动状态时显示两个不同的图标)变为非活动图标. 通常所有行的按钮图像,除了我刚刚点击的那一个已经消失了,应该是活动的。 请注意,对于这些其他行,只有图标是错误的,对于我未点击的每一行,实际状态仍然有效:如果我停止应用程序并且 运行 又一次,启动时图标没问题,在 tableView 中我只看到仍处于活动状态的对象。

我很确定我的问题与`dequeueReusableCellWithIdentifier 有关,但我不知道如何解决该问题。

以下是我的一些方法:

// TableViewController

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as MyCustomTableViewCell

    self.configureCell(cell, atIndexPath: indexPath)

    return cell
}


func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {

    let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject

    cell.customLabel.text = aObject.name
    cell.detailLabel.text = aObject.anotherProperty
    //...

    cell.objectToMarkAsInactive = aObject
}


// MyCustomTableViewCell

//... IBOutlets

var objectToMarkAsInactive : CustomObject?

@IBAction func markObjectAsInactive(sender: AnyObject) {

    activeButton.selected = !activeButton.selected

    objectToMarkAsInactive?.active = !(objectToMarkAsInactive?.active as Bool)

    saveContext()
}


override func awakeFromNib() {
    super.awakeFromNib()

    // UIImage vars

    activeButton.setImage(activeImage, forState: UIControlState.Selected)
    activeButton.setImage(inactiveImage, forState: UIControlState.Normal)
    activeButton.setImage(highlightedImage, forState: UIControlState.Highlighted)
}

我也尝试在保存上下文后重新加载 tableView,但其他行上的图标问题仍然存在。

显然,我设置 TableViewController 的单元格 objectToMarkAsInactive = aObject in configureCell 的自定义 属性 的解决方案不正确,因为单元格被重复使用,但我没有其他想法来完成我的工作想要,因为单元格的状态更改按钮必须作为 IBAction 连接到 MyCustomTableViewCell 而不是 TableViewController。

我是编程的新手,我的问题可能是由于我的错误决定造成的,但我真的可以使用一些建议,我被卡住了...

我应该停止使用 dequeueReusableCellWithIdentifier 吗?我不喜欢它,因为我可能有大量的对象,但是如果我必须使用普通单元格,我可以在没有双端队列的情况下为它们定制设计吗? "regular" 单元实例化方法在枚举 (UITableViewCellStyle.) 中仅显示普通单元的几个选项,而不是自定义单元。

提前致谢,

@cdf1982

您无需停止使用 dequeueReusableCellWithIdentifier。问题是单元格被重复使用,但如果只是按钮的图像不正确,请添加一个检查以查看需要显示哪个图像。

func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {

    let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject

    cell.customLabel.text = aObject.name
    cell.detailLabel.text = aObject.anotherProperty
    //...
    if aObject.isActive { // set button to active }
    else { // set button to inactive }

    cell.objectToMarkAsInactive = aObject
}