代码之家  ›  专栏  ›  技术社区  ›  Casey West

自定义UITableViewCell重用问题中的UISwitch

  •  0
  • Casey West  · 技术社区  · 7 年前

    问题如下:我有一个带有自定义单元格的tableview。该单元格包含一个标签和一个UISwitch。我已设置标签。文本值,但UISwitch正在被重用。

    示例:如果我切换第一行中的开关,第五行将被启用,如果我滚动,它将继续重用单元格并导致问题。

    视频: https://vimeo.com/247906440

    视图控制器:

    class ViewController: UIViewController {
    
        let array = ["One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten"]
    
        @IBOutlet weak var tableView: UITableView!
        override func viewDidLoad() {
            super.viewDidLoad()
    
        }
    
    }
    
    extension ViewController: UITableViewDelegate, UITableViewDataSource {
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell
            cell.label.text = array[indexPath.row]
            return cell
        }
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return array.count
        }
    }
    

    自定义单元格:

    class CustomTableViewCell: UITableViewCell {
    
        @IBOutlet weak var label: UILabel!
        @IBOutlet weak var toggleSwitch: UISwitch!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            // Initialization code
        }
    
    }
    

    我意识到没有代码试图存储这些数据,因为我没有成功。任何想法都会有帮助。该项目目前使用MVC模型,我相信这就是答案,但只需要一些帮助。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Mukund Sarada    7 年前

    我建议您创建cellViewModel类并保留它的数组,而不仅仅是字符串。您的cellViewModel可能看起来像,

    class CellViewModel {
     let title: String
     var isOn: Bool
    
    init(withText text: String, isOn: Bool = false /* you can keep is at by default false*/) {
        self.title = text
        self.isOn = isOn
    } 
    

    现在,构建CellViewModel的数组

    let array =["One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten"]
    var cellViewModels = [CellViewModel]()
    for text in array {
        let cellViewModel = CellViewModel(withText: text)
        cellViewModels.append(cellViewModel)
    }
    

    将tableVieDelegate函数更改为:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell
        let cellViewModel = cellViewModels[indexPath.row]
        cell.label.text = cellViewModel.title
        cell.toggleSwitch.isOn = cellViewModel.isOn
        cell.delegate = self
        return cell
    }
    

    在自定义单元格类中,添加以下协议:

    protocol CellActionDelegate: class {
        func didChangeSwitchStateOnCell(_ cell: CustomTableViewCell)
    }
    

    在自定义单元格中添加委托作为属性,

    weak var delegate: CellActionDelegate?
    

    此外,在开关更改时,添加此行,

    delegate?.didChangeSwitchStateOnCell(self)
    

    现在,您的viewController应该注册并侦听此委托: 我添加了行cellForRowAtIndexPath来注册代表。要侦听此委托,请在VC中添加此函数。

    func didChangeSwitchStateOnCell(_ cell: CustomTableViewCell) {
        let indexPath = tableView.indexPath(for: cell)
        cellViewModels[indexPath.row].isOn = cell.toggleSwitch.isOn
    }
    
        2
  •  1
  •   Florian Ldt    7 年前

    开始创建模型,例如:

    struct item {
        var id: String
        var name: String
        var isActivated: Bool
    
        init(id: String, name: String, isActivated: Bool) {
            self.id = id
            self.name = name
            self.isActivated = isActivated
        }
    
    }
    
    let item1 = item(id: "1", name: "One", isActivated: false)
    let item2 = ...........
    let item3 = ...........
    let items [item1, item2, item3]
    

    有了它,您可以触发布尔值,如果它被激活或没有。

    您还必须查看 https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse 我想。