2017-10-20 31 views
1

J'ai créé une cellule personnalisée dans mon projet Swift 4 qui inclut un commutateur. Lorsque je sélectionne un commutateur, je sélectionne tous les 10 commutateurs dans le tableau. Il y a 34 cellules dans la table. J'ai essayé plusieurs combinaisons différentes d'interaction utilisateur activée/désactivée. Même si l'état des commutateurs non sélectionnés est activé, les actions associées ne se déclenchent pas. Voici le code qui déclenche l'action:UISwitch dans une table sélectionne plusieurs cellules lorsque l'état de commutation est activé

@IBAction func SwitchAction(_ sender: UISwitch) { 

    let switchPosition = sender.convert(CGPoint(), to:tableView) 
    let indexPath = tableView.indexPathForRow(at:switchPosition) 
    let ipath = indexPath?.row 
} 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return taskList.count 

} 
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 75 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    //let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell") 
    let cell: customTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! customTableViewCell 
    cell.LabelSelect.text=taskList[indexPath.row] 

    return cell 
} 
+0

Bienvenue dans Stack Overflow - c'est bien de vous avoir. S'il vous plaît lire Comment puis-je poser une bonne question? https://stackoverflow.com/help/how-to-ask et Comment créer un exemple minimal, complet et vérifiable pour aider à maintenir le contenu de Stack Overflows au niveau le plus élevé possible et augmenter vos chances d'obtenir une réponse appropriée. https://stackoverflow.com/help/mcve –

+0

L'action de votre commutateur vous donne-t-elle l'index correct? – Tj3n

+0

ajouter une cible pour basculer dans la méthode cellforrowatindexpath – Vinodh

Répondre

0

Ceci est dû à la réutilisation des cellules. Lorsque vous faites défiler le tableau, certaines lignes disparaissent de l'écran; les cellules associées sont placées dans une file d'attente. D'autres lignes apparaissent à l'écran. la méthode cellForRowAt est appelée et prend une cellule de la file d'attente (donc dequeueReusableCell), à utiliser pour la nouvelle ligne. Si le commutateur était allumé lorsque la cellule s'est éteinte, elle restera allumée lorsqu'elle apparaîtra à l'écran - même si elle se rapporte maintenant à une rangée complètement différente. La solution consiste à maintenir un tableau qui indique si le commutateur pour une ligne donnée doit être activé ou désactivé. Vous pouvez ensuite utiliser ce tableau pour activer ou désactiver le commutateur dans la méthode cellForRowAt.

+0

Cela prend tout son sens. Je vous remercie! –