ios - Tableview 动态开关有问题,如果我选择开关并立即打开它,它不会快速打开

标签 ios swift xcode uitableview swift4.2

我创建了一个 UITableView 并根据要求将开关动态添加到每个单元格中。如果我选择一个开关并将其打开并立即选择下一个开关并将其打开,则开关状态会发生变化,并且先前选择的开关正在关闭,只有当我快速选择所有开关时才会发生.

enter image description here

这是我根据数据动态添加所有开关的图像,如果我在第一个开关上,它的数据会将它们加载到另一个表中。但是如果我快速选择所有开关并打开它们,一些开关只会停留在关闭状态。如果我点击表格的外部,它就会消失,如果我再次加载表格,那时候我可以看到所有选定的和之前启用(打开)的开关被关闭(不是全部,而是随机发生的)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

    if let _ = cell {} else {
        cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    if let d = self.data {
        cell?.textLabel?.text = d[indexPath.row]
        let switchView = UISwitch(frame: .zero)
        switchView.setOn(self.isFolderIsAdded(folderName: d[indexPath.row]), animated: true)
        switchView.tag = indexPath.row // for detect which row switch Changed
        switchView.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
        cell?.accessoryView = switchView

    }
    return cell!
}

func isFolderIsAdded(folderName:String) -> Bool{
    for   val in listOfSelectedFolder{
        if(folderName == val ){
            return true
        }
    }
    return false;
}

@objc func switchChanged(_ sender : UISwitch!){
    if let d = self.data {
        if(sender.isOn){
            self.delegate?.selectedSubFolder(name: d[sender.tag])
           } else {
            self.delegate?.deleteFilesFromFolder(folderName: d[sender.tag])
        }
    }
}

最佳答案

这是一个重用问题。 当您滚动 tableView 时,该单元格将被重新使用。 其上的开关将被重置。

您需要遵循 MVC 设计模式。 使用模型来帮助您。 像这样

class CellModel {
  var name = ""
  var switchOn = false
}

var dataSource = [CellModel]()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomCell
    cell.model = dataSource[indexPath.row]
    return cell
}
class CustomCell: UITableViewCell {

  var model: CellModel? {
     didSet {
     switchView.isOn = model?.switchOn ?? false
    }
  }
  init(xxxx) {
     switchView.addTarget(self, action:#selector(self.switchChanged(_:)), for: .valueChanged)
  }


  @objc func switchChanged(_ sender : UISwitch!){
       model.switchOn = sender.isOn
   }
  }

关于ios - Tableview 动态开关有问题,如果我选择开关并立即打开它,它不会快速打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55037485/

相关文章:

iOS9 sendSynchronousRequest 弃用

iphone - 如何纠正在 en.lproj 文件夹中创建 lproj 文件夹的 Xcode 错误?

ios - 是 Parse 的服务器提前关闭还是我遗漏了什么?

ios - 如何使用 MVVM + Swift4 实现注册屏幕

ios - Swift:自定义 UIView 未根据约束调整大小

ios - 我在理解如何使用自动布局的逻辑时遇到问题

iOS LayoutIfNeeded() 未返回正确的大小

ios - swift alamofire 异步请求 json

Xcode项目文件git merge 冲突

ios - XCode 6.0.1 行为 : Huge Delays?