J'essaie de créer un UITableViewCell personnalisé avec un UISwitch et sans utiliser de fichier storyboard / .xib. Le problème est que l'action que j'ai définie sur le commutateur UIS semble être perdue car je ne peux pas déclencher l'action du sélecteur sur le commutateur appuyé. Alors que le addTarget est défini après la cellule init. De plus, un appui sur le commutateur ne fait pas basculer l'état (pas de problème avec un fichier XIB donc le problème ne doit pas venir de UITableViewController)

class UISwitchTableViewCell: UITableViewCell {

let switchUI : UISwitch = {
    let switchUI = UISwitch()
    return switchUI
}()

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.selectionStyle = .none
    addSubview(switchUI)
    switchUI.translatesAutoresizingMaskIntoConstraints = false
    switchUI.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    switchUI.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor).isActive = true

    switchUI.addTarget(self, action: #selector(switchChanged), for: .valueChanged)
}

@objc func switchChanged(_ sender: UISwitch){
    print("switch changed")
}

required init?(coder: NSCoder) {
    fatalError("NSCoder init not implemented")
}

}

0
GrayFox 5 nov. 2020 à 14:28

2 réponses

Meilleure réponse

Le problème ne concernait pas la désallocation de la cible ou quelque chose de similaire. Le problème était causé par le textLabel par défaut de la cellule (ci-dessous défini avec un fond jaune) qui chevauchait le commutateur UIS, empêchant les interactions tactiles. La solution était donc de masquer cette étiquette par défaut et de créer la mienne avec une contrainte de fin égale à l'UISwitch LeadingAnchor.

enter image description here

0
Dharman 12 nov. 2020 à 18:09

Assurez-vous d'autoriser la sélection de UITableView et UITableviewCell

tableView.allowsSelection = true

cell.selectionStyle = .default

0
pkc456 10 nov. 2020 à 14:38