iOS tableview单元格按钮选择异常行为

时间:2018-08-04 21:15:33

标签: ios swift uitableview uibutton uisearchbar

在表格视图中,每个单元格都有一个书签图像按钮。轻按它时,它会处于选定状态,并且会显示图像(红色书签图标)。我有委托方法可以将带有选定按钮的单元格中的信息添加到数组中:

protocol CustomPoetCellDelegate {
func cell(_ cell: CustomPoetCell, didTabFavIconFor button: UIButton)
}

class CustomPoetCell: UITableViewCell {

@IBOutlet weak var poetNameLabel: UILabel!
@IBOutlet weak var verseCountLabel: UILabel!
@IBOutlet weak var periodLabel: UILabel!
@IBOutlet weak var iconButton: UIButton!

var delegate: CustomPoetCellDelegate?

override func awakeFromNib() {
    super.awakeFromNib()

    iconButton.setImage(UIImage(named: "icons8-bookmark-50-red.png"), for: .selected)
    iconButton.setImage(UIImage(named: "icons8-bookmark-50.png"), for: .normal)

    iconButton.isSelected = false
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

@IBAction func favIconTapped(_ sender: UIButton) {
    delegate?.cell(self, didTabFavIconFor: sender)
}

}

在tableViewController中:

func cell(_ cell: CustomPoetCell, didTabFavIconFor button: UIButton) {
    if !button.isSelected {
        let indexPathRow = tableView.indexPath(for: cell)!.row

        if isFiltering() {
            favoritePoets.append(searchResults[indexPathRow])
            button.isSelected = true
        } else {
            favoritePoets.append(poets[indexPathRow])
            button.isSelected = true
        }
    } else {
        button.isSelected = false

        favoritePoets = favoritePoets.filter { $0.arabicName !=  cell.poetNameLabel.text}
    }
}

isFiltering()方法检查searchBar是否在处理中。

现在,如果isFiltering()为false,则一切都很好,但是如果isFiltering()为true(即在tableView中搜索名称),则当我点击特定单元格按钮以选择它,然后单击“取消”时为了关闭searchBar,尽管仅将我点击的一个单元格添加到了数组中,但也选择了其他单元格的图标。从视图中来回导航时,错误的选择消失了,只选择了正确的选择。

有什么想法吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

问题是UITableView重用单元以优化滚动性能。因此,它将重新使用不再可见的单元格和即将显示的新单元格。因此,无论何时更新/重复使用单元,您都需要设置其状态。

每次都会调用以下函数。因此,您需要在此处为​​选定或未选定状态设置单元格属性。

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        ...
        cell.indexPath = indexPath  //Create an indexPath property in your cell and set it here
                                   //This will be required when you call the delegate method

        //configure your cell state

        return cell
   }

您可以通过更改您已经在调用的委托方法中的特定属性来更新favoritePoets数组中的模型

  favoritePoets[indexPath.row].selected = true or false

要访问indexPath,您需要按照上述代码中的说明进行设置。然后将其作为参数传递给您的委托方法。现在,此更新的属性将帮助您在cellForRowAt函数中设置状态。

希望它会有所帮助:)。随时发表评论。