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.
On dirait que vous avez besoin d'un délégué:
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)
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)}