带有协议的自定义 Cell,用于检查 UISwitch 中的更改

Custom Cell with protocol to check changes in UISwitch

我创建了一个 custom cell 和一个 protocol 来了解 UISwitch 上的变化。我想我拥有我需要的一切,但我无法触发 func didChangeSwitchState

VouchersViewController.swift

// MARK: - UITableViewDelegate

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell:VouchersFilterCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! VouchersFilterCell
    cell.delegate = self
    cell.textLabel?.text = self.vouchersFilters[indexPath.row]

    return cell
}

// MARK: - VouchersFilterCellDelegate

func didChangeSwitchState(sender: VouchersFilterCell, isOn: Bool) {
    let indexPath = self.tableView.indexPath(for: sender)
    debugPrint(indexPath?.row)
}

BaseCell.swift

class BaseCell: UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        // code common to all your cells goes here
        setupViews()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

    }

    func setupViews(){
    }
}

VouchersFilterCell.swift

protocol VouchersFilterCellDelegate: class {
    func didChangeSwitchState(sender: VouchersFilterCell, isOn: Bool)
}

class VouchersFilterCell: BaseCell {

    // MARK: - UIComponent

    let titleLabel = UILabel()
    let filterSwitch: UISwitch = {
        let fSwitch = UISwitch()
        fSwitch.addTarget(self, action: #selector(handledSwitchChange(sender:)), for: .valueChanged)
        return fSwitch
    }()

    weak var delegate: VouchersFilterCellDelegate?

    // MARK: - Life Cycle    

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    // MARK: - Setup

    override func setupViews() {
        addSubview(titleLabel)
        addSubview(filterSwitch)

        addConstraintsWithFormat(format: "V:|-13-[v0]-13-|", views: titleLabel)
        addConstraintsWithFormat(format: "H:|-16-[v0]-16-[v1]-16-|", views: titleLabel, filterSwitch)
        addConstraintsWithFormat(format: "V:|-7-[v0]", views: filterSwitch)
    }

    // MARK: - IBAction 

    @IBAction func handledSwitchChange(sender: UISwitch) {
        self.delegate?.didChangeSwitchState(sender: self, isOn:filterSwitch.isOn)
    }
}

正如我们在评论中一起发现的那样,似乎在 self 准备好之前创建了一个 let 属性,因此 Switch 目标为 nil。更改为惰性 var 可确保首先创建 self。

lazy var filterSwitch: UISwitch = {
    let fSwitch = UISwitch()
    fSwitch.addTarget(self, action: #selector(handledSwitchChange(sender:)), for: .valueChanged)
    return fSwitch
}()