gpt4 book ai didi

iOS tableview 单元格按钮选择奇怪的行为

转载 作者:行者123 更新时间:2023-11-28 05:55:08 25 4
gpt4 key购买 nike

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

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() 为假,一切正常,但如果 isFiltering() 为真(即在 tableView 中搜索名称),当我点击特定的单元格按钮将其选中,然后单击取消为了关闭搜索栏,其他单元格的图标也被选中,尽管只有我点击的那个被添加到数组中。在 View 中来回导航时,错误的选择会消失,只会选择正确的。

知道发生了什么事吗?

提前致谢。

最佳答案

问题在于 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
}

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

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

要访问 indexPath,您需要按照上面的代码进行设置。然后将其作为参数传递到您的委托(delegate)方法中。现在,这个更新后的属性将帮助您在 cellForRowAt 函数中设置状态。

希望对您有所帮助:)。欢迎发表评论。

关于iOS tableview 单元格按钮选择奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51689612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com