J'essaye d'implémenter le bouton dynamique sur la cellule de tableview. Je suis capable d'ajouter le bouton mais selon l'exigence sur la dernière cellule je ne veux pas ajouter le bouton mais il est ajouté là aussi comme ci-dessous mentionne la capture d'écran
Ceci est l'exigence mon code cellForRowAt indexPath est ci-dessous.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if let _ = cell {
print("cell is available")
} else {
cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
}
cell?.textLabel?.textAlignment = .left
cell?.textLabel?.text = list[indexPath.row]
let btn = UIButton(type: UIButtonType.custom) as UIButton
if cell?.textLabel?.text == "â Add Room" || list[indexPath.row] == "â Add Room"{
btn.isHidden = true
cell?.textLabel?.textAlignment = .center
}else{
btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
btn.tag = indexPath.row
btn.setImage(UIImage(named: "delete.png"), for: .normal)
cellx = list[btn.tag]
cell?.contentView.addSubview(btn)
}
return cell!
}
et le résultat après ce spectacle ci-dessous la capture d'écran
Je ne veux pas afficher le bouton de suppression dans la ligne + Ajouter une pièce qui est présente dans la dernière ligne du tableau. S'il vous plaît me suggérer comment obtenir le comme mention dans l'exigence. J'ai fait une condition pour que le texte ("Ajouter le texte de la pièce") s'affiche au centre et s'affiche avec succès au centre. Merci d'avance, aidez-moi à résoudre ce problème.
2e problème
dans cette liste donnée si je sélectionne "COPENHAGUE" et que j'essaye de le supprimer, c'est la suppression du contenu supérieur signifie que le fichier BARCELONA est supprimé. Je ne supprime pas le même contenu sélectionné de la liste.
3 Réponses :
Essayez de cette façon
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! cell
if indexPath.row == (list.count - 1) {
btn.isHidden = true
cell?.textLabel?.textAlignment = .center
}else{
btn.isHidden = false
btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
btn.tag = indexPath.row
btn.setImage(UIImage(named: "delete.png"), for: .normal)
cellx = list[btn.tag]
cell?.contentView.addSubview(btn)
}
Je n'ai pas testé ce code ci-dessus juste fait quelques changements mineurs peut-être que cela fonctionnera :) Sinon, merci de me le faire savoir.
EDIT1: Réponse mise à jour
@AnkitaKhare voudriez-vous déboguer si indexPath.row == (list.count - 1) ligne renvoie true pour false pour le dernier cas?
Cela se produit parce que UITableView réutilise les cellules précédemment créées. Donc, pour la dernière cellule, il faut une cellule déjà créée avec un bouton à l'intérieur.
Il serait préférable de créer votre propre sous-classe de UITableViewCell et de l'utiliser.
Mais si vous ne voulez pas faire cela, vous peut utiliser cette version de votre code:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if let cell = cell {
print("cell is available")
// Remove previously created button from reused cell view
if let button = cell.contentView.subviews.first(where: { (view: UIView) -> Bool in
view.isKind(of: UIButton.self)
}) {
button.removeFromSuperview()
}
} else {
cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
}
cell?.textLabel?.textAlignment = .left
cell?.textLabel?.text = list[indexPath.row]
if indexPath.row == (list.count - 1) {
cell?.textLabel?.textAlignment = .center
} else {
let btn = UIButton(type: UIButtonType.custom) as UIButton
btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
btn.tag = indexPath.row
btn.setImage(UIImage(named: "delete.png"), for: .normal)
cellx = list[btn.tag]
cell?.contentView.addSubview(btn)
}
return cell!
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if let _ = cell {
print("cell is available")
} else {
cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
}
cell?.textLabel?.textAlignment = .left
cell?.textLabel?.text = list[indexPath.row]
let btn = UIButton(type: UIButtonType.custom) as UIButton
if cell?.textLabel?.text == "â Add Room" || list[indexPath.row] == "â Add Room"{
for view in cell?.contentView.subviews as [UIView] {
if let button = view as? UIButton {
button.isHidden = true
}
}
cell?.textLabel?.textAlignment = .center
}else{
btn.frame = CGRect(x: 146, y: 0, width: 20, height: (cell?.frame.height)!)
btn.addTarget(self, action: #selector(buttonPressed(sender: )), for: .touchUpInside)
btn.tag = indexPath.row
btn.setImage(UIImage(named: "delete.png"), for: .normal)
cellx = list[btn.tag]
cell?.contentView.addSubview(btn)
}
return cell!
}
Try this. It is because of your program flow. btn instance is created for every table rows and you set hidden just the instance of the btn for last row. Table cell reused dequeue cell even though you did not add created btn into table cell content view for the latest cell. So, you need to search the button from the content view and set hidden.
Essayez d'ajouter un point d'arrêt sur la condition if else et voyez s'il entre si?
Mettez de cette façon si indexPath.row == (list.count - 1) {print ("last row") // ajoutez votre logique ici}
Chaque fois que la cellule sera retirée de la file d'attente, un nouveau bouton sera ajouté à votre cellule. Vous devriez gérer cela.
Il vous suffit d'utiliser btn.isHidden = false dans une autre partie
Créez simplement le bouton dans UitabilViewCell Class au lieu de CellfrowrotinDindexpath et masquez-le et montrez-le en fonction de la méthode de l'index et de la méthode PREPREFOREFORREURE, faites-la masquer le bouton.
@Ankita khare, veuillez vérifier la réponse mise à jour