gpt4 book ai didi

ios - 表格单元格中的 UIswitch 重复问题

转载 作者:行者123 更新时间:2023-11-30 11:23:49 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个包含 7 个部分的表格 View ,每个部分有 8 个单元格,其中包含 Stepper(在 UIView 中)、UIButton(在 UIView 中)和 UISwitch(在 UIview 中)。现在我可以设置和获取步进器和 UIButton 的值,但我的问题是 UISwitch。它被重复使用并同时显示开/关状态(有线 UI)。我还维护了一个数组来保存开关状态,但它没有正确反射(reflect)。下面是代码

var myData1 : [Bool] = [false,false,false,false,false,false,false,false]

let cell:DefaultTableViewCell = (self.tblviewSwitchPOints.dequeueReusableCell(withIdentifier: "defaultcell", for: indexPath) as? DefaultTableViewCell)!

cell.viewForButton.tag = indexPath.row
cell.selectionStyle = .none
cell.viewForSwitch.tag = indexPath.row
print("in cell for row")

if indexPath.section == 0
{
switch indexPath.row
{
case 0:
cell.lblMain.text = timePerDay[indexPath.row]
cell.lblTemp.text = row1[0]
cell.lblTime.text = row1[1]
cell.lblMain.tag = indexPath.row
cell.viewForStepper.addSubview(valueStepper1)
cell.viewForButton.addSubview(btnCustom1)
cell.viewForSwitch.addSubview(switchOnOff1)

if myData1.count==0
{

}else
{
switchOnOff1.isOn = myData1[0]
}
switchOnOff1.tag = 0
switchOnOff1.addTarget(self,action:#selector(actionOnOff1(sender:)), for:.valueChanged )

let temp = arrTemp1[indexPath.row]
if arrTimeInDouble1.count==0
{

}else if temp.elementsEqual("FFFF")
{
valueStepper1.value = 5
}else
{
valueStepper1.value = arrTimeInDouble1[indexPath.row]
}

valueStepper1.tag = indexPath.row

btnCustom1.tag = indexPath.row
if arrTime1.count==0
{

}else
{
btnCustom1.titleLabel?.text = arrTime1[indexPath.row]
}

valueStepper1.addTarget(self, action: #selector(valueChangedTemp1(sender:)), for: .valueChanged)
btnCustom1.addTarget(self, action:#selector(datePickerTapped1), for: .touchUpInside)
print("in cell fro row1\(myData1)\(switchOnOff3.isOn)\(switchOnOff1.tag)")
return cell


case 1:
cell.lblMain.text = timePerDay[indexPath.row]
cell.lblTemp.text = row2[0]
cell.lblTime.text = row2[1]
cell.lblMain.tag = indexPath.row
cell.viewForStepper.addSubview(valueStepper2)
cell.viewForSwitch.addSubview(switchOnOff2)
if myData1.count==0
{

}else
{
switchOnOff2.isOn = myData1[1]
}
switchOnOff2.tag = indexPath.row
if arrTimeInDouble1.count==0
{

}else
{
valueStepper2.value = arrTimeInDouble1[indexPath.row]
}

cell.viewForButton.addSubview(btnCustom2)
btnCustom2.tag=indexPath.row
valueStepper2.tag = indexPath.row

if arrTime1.count==0
{

}else
{
btnCustom2.titleLabel?.text = arrTime1[indexPath.row]
}

switchOnOff2.addTarget(self, action: #selector(actionOnOff1(sender:)), for:.valueChanged )
valueStepper2.addTarget(self, action: #selector(valueChangedTemp1(sender:)), for: .valueChanged)
btnCustom2.addTarget(self, action:#selector(datePickerTapped1), for: .touchUpInside)

return cell
}

最佳答案

可能有很多地方出了问题,但我怀疑你的情况是你的每个开关都分配了多个目标/操作对;您使单元出列,然后在交换机上调用 addTarget,其中先前的目标仍在交换机上。

无论如何,处理这些情况时最好的做法是将大部分代码放入 TableView 单元格中。我实际上建议您使用委托(delegate)将消息从单元格返回到 View Controller ,因此出队应该如下所示:

let cell: DefaultTableViewCell = tableView.dequeueReusableCell(withIdentifier: "defaultcell", for: indexPath) as! DefaultTableViewCell
cell.myObject = myObjectSections[indexPath.section][indexPath.row]
cell.delegate = self
return cell

没有别的了。现在单元格应该执行所有逻辑:

class DefaultTableViewCell: UITableViewCell {

weak var delegate: DefaultTableViewCellDelegate?
var myObject: MyObject? {
didSet { refresh() }
}

override func awakeFromNib() {
super.awakeFromNib()
self.switch.addTarget(self, action:#selector(switchMoved)), for:.valueChanged)
}
func refresh() {
// Change all UI related stuff here
}

@objc private func switchMoved() {
if let myObject = myObject {
delegate?.defaultTableViewCell(self, didChangeWhateverStateOf:myObject to: switch.on)
}
}

}

当然,需要适本地定义协议(protocol)。对于我的情况是

protocol DefaultTableViewCellDelegate: class {
func defaultTableViewCell(_ sender: DefaultTableViewCell, didChangeWhateverStateOf myObject: MyObject, to flag: Bool)
}

并且您的 View Controller 需要实现此协议(protocol)。

有时,为数据添加索引路径实际上可能是有意义的。为此,您只需升级此代码,以便单元格还包含 var indexPath: IndexPath!。现在,在使单元出队后,您可以分配其新的索引路径。然后在您的委托(delegate)方法中您可以随时访问它:

extension MyViewController: DefaultTableViewCellDelegate {
func defaultTableViewCell(_ sender: DefaultTableViewCell, didChangeWhateverStateOf myObject: MyObject, to flag: Bool) {
print("This is cell at section \(sender.indexPath.section), row: \(sender.indexPath.row)")
}

}

关于ios - 表格单元格中的 UIswitch 重复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50980766/

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