0
votes

création de bouton tableview dynamiquement dans le numéro de cellule dans Swift

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

entrez la description de l'image ici

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

 entrez la description de l'image ici

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.


6 commentaires

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


3 Réponses :


0
votes

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


1 commentaires

@AnkitaKhare voudriez-vous déboguer si indexPath.row == (list.count - 1) ligne renvoie true pour false pour le dernier cas?



1
votes

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!
}


0 commentaires

0
votes
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.

0 commentaires