gpt4 book ai didi

ios - UICollectionViewCell 重用导致不正确的 UISwitch 状态

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:18 24 4
gpt4 key购买 nike

我找不到解决此问题的方法。我在 UICollectionViewCell 中使用 UISwitch 并且我正在传递一个 bool 变量来设置开关打开或关闭。

条件是所有单元一次只需要打开一个开关。但是当我打开一个开关时,另一个随机开关的色调颜色发生变化,这意味着它的状态发生了变化。

默认情况下, Storyboard中的开关状态为打开,即使我将其设置为关闭也没有任何变化。

我不明白为什么会这样。

这是我的 cellForItemAtIndexPath

代码
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AddEditItemPopupView.cellId, for: indexPath) as! DiscountCollectionViewCell
cell.delegate = self

let currentDiscount = allDiscounts[indexPath.item]
let shouldApplyDiscount = updatedDiscountId == currentDiscount.id
cell.updateCellWith(data: currentDiscount, applyDiscount: shouldApplyDiscount)
return cell
}

和单元类的代码

func updateCellWith(data: DiscountModel, applyDiscount: Bool) {
let name = data.title.replacingOccurrences(of: "Discount ", with: "")
self.titleLabel.text = String(format: "%@ (%.2f%%)", name, data.value)
self.switchApply.isOn = applyDiscount
self.switchApply.tag = data.id
}

数据源包含如下所示的 DiscountModel 对象:

{
id: Int!
title: String!
value: Double!
}

单元格类中的开关值改变方法:

@IBAction func switchValueChanged(_ sender: UISwitch) {
if sender.isOn {
self.delegate?.switchValueDidChangeAt(index: sender.tag)
}
else{
self.delegate?.switchValueDidChangeAt(index: 0)
}
}

View Controller 类中的委托(delegate)方法:

func switchValueDidChangeAt(index: Int) {
self.updatedDiscountId = index
self.discountCollectionView.reloadData()
}

最佳答案

我建议对您的代码进行一些改进;

  • 重新加载整个 Collection View 有点像霰弹枪
  • 由于可能没有应用任何折扣,您可能应该为所选折扣使用一个可选值,而不是“0”
  • 使用Tag经常会出问题

我会使用类似的东西:

var currentDiscount: DiscountModel? = nil

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AddEditItemPopupView.cellId, for: indexPath) as! DiscountCollectionViewCell
cell.delegate = self

let item = allDiscounts[indexPath.item]
self.configure(cell, forItem: item)

return cell
}

func configure(_ cell: DiscountCollectionViewCell, forItem item: DiscountModel) {
cell.switchApply.isOn = false
let name = item.title.replacingOccurrences(of: "Discount ", with: "")
self.titleLabel.text = String(format: "%@ (%.2f%%)", name, item.value)

guard let selectedDiscount = self.currentDiscount else {
return
}

cell.switchApply.isOn = selectedDiscount.id == item.id
}

func switchValueDidChangeIn(cell: DiscountCollectionViewCell, to value: Bool) {
if value {
if let indexPath = collectionView.indexPath(for: cell) {
self.currentDiscount = self.allDiscounts[indexPath.item]
}
} else {
self.currentDiscount = nil
}
for indexPath in collectionView.indexPathsForVisibleItems {
if let cell = collectionView.cellForItem(at: indexPath) {
self.configure(cell, forItem: self.allDiscounts[indexPath.item])
}
}
}

在你的手机里:

@IBAction func switchValueChanged(_ sender: UISwitch) {
self.delegate?.switchValueDidChangeIn(cell:self, to: sender.isOn)
}

关于ios - UICollectionViewCell 重用导致不正确的 UISwitch 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54376360/

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