J'ai un contrôleur de vue avec une vue de tableau et une pointe distincte pour le modèle de cellule de tableau. Le modèle de cellule a quelques boutons. Je veux accéder au bouton cliquez avec l'index de la cellule cliquée dans le contrôleur de vue où j'ai défini la vue Table.
Donc j'ai ViewController.h
et ViewController.m
où j'ai le UITableView
et TableTemplate.h
, TableTemplate.m
et TableTemplate.xib
où j'ai défini la plume. Je veux l'événement de clic sur le bouton avec l'index de la cellule ViewController.m
.
Une aide sur comment puis-je faire cela?
la source
Les délégués sont la voie à suivre.
Comme vu avec d'autres réponses, l'utilisation de vues peut devenir obsolète. Qui sait demain il y aura peut-être un autre wrapper et devra peut-être l'utiliser
cell superview]superview]superview]superview]
. Et si vous utilisez des balises, vous obtiendrez un nombre n de conditions if else pour identifier la cellule. Pour éviter tout cela, configurez des délégués. (Ce faisant, vous allez créer une classe de cellule réutilisable. Vous pouvez utiliser la même classe de cellule comme classe de base et tout ce que vous avez à faire est d'implémenter les méthodes déléguées.)Nous avons d'abord besoin d'une interface (protocole) qui sera utilisée par la cellule pour communiquer les clics de bouton (déléguer). ( Vous pouvez créer un fichier .h distinct pour le protocole et l'inclure à la fois dans le contrôleur de vue table et dans les classes de cellules personnalisées OU simplement l'ajouter dans la classe de cellule personnalisée qui sera de toute façon incluse dans le contrôleur de vue table )
Incluez ce protocole dans le contrôleur de vue de cellule et de tableau personnalisé. Et assurez-vous que le contrôleur de vue de table confirme ce protocole.
Dans une cellule personnalisée, créez deux propriétés:
Dans le
UIButton
délégué IBAction, cliquez sur: ( même chose peut être faite pour toute action dans la classe de cellule personnalisée qui doit être déléguée au contrôleur de vue )Dans le contrôleur de vue de table
cellForRowAtIndexPath
après avoir retiré la cellule, définissez les propriétés ci-dessus.Et implémentez le délégué dans le contrôleur de vue table:
Ce serait l'approche idéale pour obtenir des actions de bouton de cellule personnalisées dans le contrôleur de vue tableau.
la source
Au lieu de jouer avec les tags, j'ai adopté une approche différente. Délégué créé pour ma sous-classe de UITableViewCell (OptionButtonsCell) et ajouté un indexPath var. À partir de mon bouton dans le storyboard, j'ai connecté @IBAction à OptionButtonsCell et là, j'envoie la méthode de délégué avec le bon indexPath à toute personne intéressée. Dans la cellule pour le chemin d'index, j'ai défini indexPath actuel et cela fonctionne :)
Laissez le code parler de lui-même:
Swift 3 Xcode 8
OptionButtonsTableViewCell.swift
MyTableViewController.swift
la source
class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate
j'obtiens une erreur à cette ligne: // erreur: conformité redondante de 'MyTableViewController' au protocole 'UITableViewDataSource'Cela devrait aider: -
Ici, l' expéditeur est l'instance UIButton qui envoie l'événement. myTableView est l'instance UITableView avec laquelle vous traitez.
Obtenez simplement la bonne référence de cellule et tout le travail est terminé.
Vous devrez peut-être supprimer les boutons du contentView de la cellule et les ajouter directement à l'instance UITableViewCell en tant que sous-vue.
Ou
Vous pouvez formuler un schéma de dénomination des balises pour différents UIButtons dans cell.contentView. En utilisant cette balise, vous pourrez ultérieurement connaître les informations de ligne et de section selon vos besoins.
la source
Le code suivant pourrait vous aider.
J'ai pris
UITableView
avec une classe de cellule prototype personnalisée nommée à l'UITableViewCell
intérieurUIViewController
.Donc j'ai
ViewController.h
,ViewController.m
etTableViewCell.h
,TableViewCell.m
Voici le code pour cela:
ViewController.h
ViewController.m
Classe de cellule personnalisée:
et
Remarque : Ici, j'ai tout pris en
UIControls
utilisant Storyboard.J'espère que cela peut vous aider ... !!!
la source
La raison pour laquelle j'aime la technique ci-dessous, car elle m'aide également à identifier la section du tableau.
Ajouter un bouton dans la cellule cellForRowAtIndexPath:
AddTask d'événement:
Espère cette aide.
la source
Utilisez les fermetures Swift:
la source
Le code de Tarun ne fonctionne pas sur iOS7, car la structure UITableViewCell a changé et maintenant il obtiendrait "UITableViewCellScrollView" à la place.
Cet article Obtenir UITableViewCell avec superview dans iOS 7 a une bonne solution pour créer une boucle pour trouver la vue parent correcte, indépendamment des modifications futures de la structure. Cela revient à créer une boucle:
Le lien contient du code pour une solution plus réutilisable, mais cela devrait fonctionner.
la source
Swift 2.2
Vous devez ajouter une cible pour ce bouton.
FunctionName: connecté // par exemple
Et bien sûr, vous devez définir la balise de ce bouton puisque vous l'utilisez.
Vous pouvez y parvenir en sous-classant UITableViewCell. Utilisez-le dans le générateur d'interface, déposez un bouton sur cette cellule, connectez-le via une prise et c'est parti.
Pour obtenir le tag dans la fonction connectée:
la source
Swift 3 avec une fermeture
Une bonne solution consiste à utiliser une fermeture dans un UITableViewCell personnalisé pour rappeler au viewController pour une action.
Dans la cellule:
Contrôleur In View: Délégué Tableview
la source
Je trouve plus simple de sous-classer le bouton à l'intérieur de votre cellule (Swift 3):
Dans votre classe de cellule:
Dans la source de données de la vue table ou de la vue collection, lors du retrait de la cellule, attribuez au bouton son chemin d'index:
Vous pouvez donc simplement mettre ce code dans votre contrôleur de vue table:
Et n'oubliez pas de définir la classe du bouton dans votre Interface Builder et de la lier à la
handleTapOnCellInfoButton
fonction!édité:
Utilisation de l'injection de dépendances. Pour configurer l'appel d'une fermeture:
et injectez la fermeture dans la méthode willDisplay du délégué de la vue de collection:
la source
Son travail pour moi.
la source
la source
pour swift 4:
la source
Si vous souhaitez passer la valeur du paramètre de la cellule à UIViewController en utilisant la fermeture, alors
la source
La réponse @Mani est bonne, mais les balises de vues à l'intérieur de contentView de la cellule sont souvent utilisées à d'autres fins. Vous pouvez utiliser la balise de cellule à la place (ou la balise contentView de la cellule):
1) Dans votre
cellForRowAtIndexPath:
méthode, attribuez la balise de la cellule comme index:2) Ajoutez une cible et une action pour votre bouton comme ci-dessous:
3) Créez une méthode qui renvoie la ligne de l'expéditeur (merci @Stenio Ferreira):
4) Actions de code basées sur l'index:
la source
CustomTableCell.h est un UITableViewCell:
MyVC.m après les importations:
À l'intérieur de "cellForRowAtIndexPath" dans MyVC.m:
MyVC.m:
la source
la source