在表格视图中,每个单元格都有一个书签图像按钮。轻按它时,它会处于选定状态,并且会显示图像(红色书签图标)。我有委托方法可以将带有选定按钮的单元格中的信息添加到数组中:
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,尽管仅将我点击的一个单元格添加到了数组中,但也选择了其他单元格的图标。从视图中来回导航时,错误的选择消失了,只选择了正确的选择。
有什么想法吗?
谢谢。
答案 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函数中设置状态。
希望它会有所帮助:)。随时发表评论。