web-dev-qa-db-fra.com

Obtenez l'IndexPath à l'intérieur d'une sous-classe UITableViewCell dans Swift

J'ai une sous-classe UITableViewCell personnalisée et son xib associé. J'ai un UILabel et un UIButton dans cette cellule et j'ai câblé l'action de retouche à l'intérieur du bouton à la sous-classe.

Ce dont j'ai besoin, c'est lorsque ce bouton dans la cellule est tapé, pour obtenir le chemin d'index de la cellule qui a ce bouton. Et peut-être le renvoyer au contrôleur de vue via un délégué ou quelque chose.

Étant donné que je suis dans une sous-classe UITableViewCell, je ne peux pas utiliser une solution comme this car je n'ai pas de référence à la table vue depuis l'intérieur de la sous-classe de cellule. Après une enquête plus approfondie, j'ai trouvé ne autre solution et je l'ai implémentée dans Swift comme ceci.

import UIKit

class ContactCell: UITableViewCell {

    @IBOutlet weak var nameLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        selectionStyle = .None
    }

    @IBAction func callButtonPressed(sender: UIButton) {
        let indexPath = (self.superview as UITableView).indexPathForCell(self)
        println("indexPath?.row")
    }

}

Mais lorsque je tape sur le bouton, il se bloque avec un message d'erreur disant La diffusion dynamique Swift a échoué .

Une idée de ce qui ne va pas avec mon code?

Ou je suis ouvert à toute autre suggestion qui me permettrait d'atteindre le résultat souhaité d'une autre manière.

Je vous remercie.

20
Isuru

On dirait que vous avez besoin d'un délégué:

Délégués en rapide?

Ensuite, passez simplement la cellule elle-même en tant que paramètre au délégué, puis vous pouvez facilement faire tableView.indexPathForCell(cellFromDelegateMethod)

22
ullstrm

UIButton.Type n'a vraiment pas de vue d'ensemble des membres, mais l'expéditeur a

var cell: UITableViewCell = sender.superview.superview as UITableViewCell

Hé, vous pouvez également utiliser "Tag" du bouton. A l'intérieur de la méthode cellForRowAt du délégué de table, vous pouvez baliser le bouton avec Indexpath.row. voici l'exemple que j'ai essayé de dire.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// get ur cell nib .As it has a button
cell.startOrConntinuBtn.addTarget(self, action: #selector(sumbitOrContinue), for: .touchUpInside) 

cell.startOrConntinuBtn.tag = indexPath.row }

et dans la méthode tactile "sumbitOrContinue" -

 func sumbitOrContinue(sender: UIButton!) { 
let tag = sender.tag
// do what you want to do like this example

let detail = self.detailList[tag]
let vc  = self.storyboard?.instantiateViewController(withIdentifier: "mockExamInt") as! MockWindowVc
vc.detailId = detail.id
self.navigationController?.pushViewController(vc, animated: true)}
2
Sibasish