2 votes

Bouton de cellule du TableView de Swift 3.0

J'ai mis en place un bouton sur la cellule du tableau et je me demande comment je peux le manipuler. Plus précisément, je souhaite modifier le nom du bouton et ajouter une autre cible (capacités différentes du bouton) lorsque le bouton est cliqué. Je pense que cela doit être ajouté dans le func buttonClicked, mais je ne sais pas comment référencer la cellForRow spécifique qui a été cliquée. Peut-être peut-on utiliser une condition dans cellForRow qui détermine le titre du bouton ? Je ne suis pas trop sûr de la meilleure façon de procéder.

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

    let button : UIButton = UIButton(type:UIButtonType.custom) as UIButton

    button.frame = CGRect(origin: CGPoint(x: 200,y :60), size: CGSize(width: 100, height: 24))
    let cellHeight: CGFloat = 44.0
    button.center = CGPoint(x: view.bounds.width / (4/3), y: cellHeight / 2.0)

    button.setTitleColor(.blue, for: .normal)
    button.addTarget(self, action: #selector(buttonClicked), for: UIControlEvents.touchUpInside)
    button.setTitle("Add", for: UIControlState.normal)

    cell.addSubview(button)

    return cell
}

func buttonClicked(sender : UIButton!) {
    print("Added!")

}

7voto

Pour Swift 3.2 et 4.0

Trouver " indexPath.row " et " indexPath.section "

//Ajouter une cible sur le bouton dans "cellForRowAt".

cell.myBtn.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

// Ajouter une fonction

func btnAction(_ sender: UIButton) {

    let point = sender.convert(CGPoint.zero, to: yourTableView as UIView)
    let indexPath: IndexPath! = yourTableView.indexPathForRow(at: point)

    print("row is = \(indexPath.row) && section is = \(indexPath.section)")
}

4voto

BHAVIK PANCHAL Points 665

Chnage et ajout avec votre code

    button.addTarget(self, action:#selector(YourViewController.buttonClicked(_:)), for: .touchUpInside)

    button.tag = indexPath.row

func buttonClicked(sender : UIButton!) {
    print("Added!")
     let row = sender.tag;
    print(row)

}

2voto

Michael Points 2353

Il y a deux façons de procéder : la méthode du tricheur ou la méthode correcte. La méthode correcte consiste à sous-classer UITableViewCell, auquel cas vous pouvez connecter les sorties de la manière habituelle. La façon de tricher consiste à utiliser la propriété tag de chaque élément. Si vous définissez la balise du bouton à (disons) 1, vous pouvez utiliser la propriété cell.viewWithTag sur cellForRowAt pour le localiser : Comme dans :

let button = cell.viewWithTag(1) as! UIButton

Sachez que la recherche s'effectuera dans toute la hiérarchie ci-dessous. cell Vous devez donc vous assurer que vous n'avez pas plusieurs vues secondaires avec la même balise.

D'après votre question, je suppose que vous voulez cliquer sur le bouton et faire modifier son titre. Le gestionnaire de clic devrait juste recharger la ligne de tableView (ou la table entière si vous êtes paresseux comme moi), et cellForRowAt doit savoir quel titre afficher. L'état de ce qui doit être affiché sur le bouton de chaque ligne doit être maintenu en dehors de la cellule tableView, car les cellules sont réutilisées lorsque vous faites défiler la page. Cela signifie qu'une fois que la rangée supérieure a disparu de l'écran, la même cellule peut être réutilisée pour la 20e rangée (par exemple). Le code dans cellForRowAt doit réinitialiser complètement le contenu de la cellule au cas où elle aurait déjà été utilisée pour une autre ligne.

Pour ajouter un détail à votre commentaire sur la question, il ne faut jamais éviter de réutiliser les cellules, car c'est une très bonne chose. Vous pouvez afficher un tableau de 1 000 lignes, mais seules 10 sont visibles à l'écran. La réutilisation des cellules signifie qu'iOS peut créer aussi peu que 10 cellules pour afficher l'ensemble de votre tableau, au lieu de 1 000. Les performances sont donc plus rapides.

1voto

xscoder Points 1128

En Swift 4.x vous pouvez simplement demander au délégué du TableView de lui attribuer une balise, comme ceci :

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

    // Assign tags
    cell.myButton.tag = indexPath.row

    return cell
}

Ensuite, connectez votre bouton du Storyboard par un clic droit + glisser vers votre .swift comme un @IBAction , sélectionnez Type -> UIButton et cliquez sur Connectez-vous à .

Voici le code :

 @IBAction func myButt(_ sender: UIButton) {
    let buttTag = sender.tag // get the Tag of the clicked button in the Cell

    // write the code that will be called on click of your button 
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X