/ / Chevauchement de boutons dû à la réutilisation des cellules - ios, swift, uitableview

Chevauchement de boutons dû à la réutilisation des cellules - ios, quick, uitableview

J'ai des problèmes avec la fonction de cellule réutilisable de file d'attente dans mon UITableView. La tableview a deux cellules, chacune contenant un bouton.

Lorsque je fais défiler, la cellule est recréée et les nouveaux boutons commencent à chevaucher les anciens (jusqu’à ce que je dispose des mêmes boutons dans la même cellule). J'ai entendu dire que vous étiez censé utiliser le removeFromSuperview fonction pour résoudre ce problème, mais je ne suis pas vraiment sûr de savoir comment le faire.

Voici une photo de mon application:

image

Et voici le cellForRowAtIndexPath (où le problème se produit)

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


let nameLabel: UILabel = {
let label = UILabel()
label.text = "Sample Item"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()

let actionButton = YSSegmentedControl(
frame: CGRect.zero,
titles: [
"No",
"Yes"
])

Réponses:

0 pour la réponse № 1

La raison pour laquelle vous voyez plusieurs boutons apparaissentC'est parce que la méthode cellForRowAtIndexPath: est appelée chaque fois qu'une nouvelle cellule de tableau est nécessaire. Puisque vous créez probablement le bouton dans ce corps de méthode, il est recréé chaque fois que la cellule est réutilisée et vous les verrez se superposer ainsi. La manière correcte d'utiliser dequeueReusableCell: avec des éléments personnalisés consiste à créer une Une classe UITableViewCell et la définissant comme classe de la cellule de table dans votre storyboard. Ensuite, lorsque vous appelez dequeueReusableCell: vous obtiendrez une copie de votre sous-classe contenant tout votre code personnalisé. Vous aurez besoin de faire une conversion de type pour avoir accès à n'importe quel code personnalisé comme ceci:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath:   IndexPath) -> UITableViewCell{
if let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as? MyCustomCellClass {
cell.nameLabel.text = "Sample item"
}

// This return path should never get hit and is here only as a typecast failure fallback
return tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath);
}

Votre sous-classe de cellules personnalisée devrait alors ressembler à ceci:

class MyCustomCellClass: UITableViewCell {
@IBOutlet var nameLabel: UILabel!
@IBOutlet var actionButton: UIButton!

@IBAction func actionButtonPressed(_ sender: UIButton) {
//Do something when this action button is pressed
}
}

0 pour la réponse № 2

Vous pouvez ajouter une nouvelle étiquette / bouton dans cellForRowAtIndexPath, mais vous devez vous assurer qu'il n'y en a pasétiquette / bouton avant de créer et d’en ajouter de nouveaux. Une façon de le faire est de définir une étiquette sur l'étiquette / le bouton et, avant de générer une nouvelle étiquette / un nouveau bouton, vérifiez si la vue avec l'étiquette est déjà dans la cellule.

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

if let label = cell.viewWithTag(111) as? UILabel
{
label.text = "Second Labels"
}
else{
let label = UILabel()
label.tag = 111
label.text = "First Labels"
cell.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.frame = CGRect(x:0, y:10, width: 100, height:30)
}

return cell
}