Très bien, j'ai donc une scène TableView
et je vais mettre un bouton dans chacune des cellules et j'ai besoin que chaque cellule, lorsque vous cliquez dessus, segue
dans sa propre scène ViewController
. En d'autres termes, j'ai besoin de savoir comment connecter un bouton à une scène (le seul bouton que j'ai à présent est "lait")
Je sais comment créer une IBAction
liée à un bouton, mais que mettrais-je dans la IBAction
?
Je suis un débutant, il me faut une explication étape par étape ici. J'ai inclus une photo de mon story-board. Je n'ai pas encore écrit de code.
Si vous souhaitez qu'un bouton déclenche la transition de la division, la meilleure chose à faire est Ctrl + Clic du bouton vers le contrôleur de vue et choisissez une option de division (comme Push). Cela le connectera à IB pour vous.
Si vous voulez écrire le code pour le faire vous-même manuellement, vous pouvez le faire en nommant le segue (il existe une option d'identifiant que vous pouvez définir une fois que vous l'avez créé - vous devez toujours créer le segue dans IB avant de pouvoir le faire. vous pouvez le déclencher avec ce code:
V2
@IBAction func about(sender: AnyObject) {
performSegueWithIdentifier("about", sender: sender)
}
V3
@IBAction func about(_ sender: Any) {
performSegue(withIdentifier: "about", sender: sender)
}
Vous pouvez utiliser le modèle de délégation . En supposant que vous ayez implémenté une cellule de tableau personnalisée, vous pouvez définir une propriété dans sa classe pour contenir tout ce qui vous semble utile pour identifier la ligne - il peut s'agir de son index, ou (à mon goût) d'une instance d'une classe qui représente le données affichées dans la cellule (je l’appelle MyCellData
.
L'idée est de laisser la cellule informer le contrôleur de vue de table d'un appui sur ce bouton, en transmettant des données pertinentes sur (les données affichées dans) la ligne. Le contrôleur de vue table lance ensuite une séquence et dans la méthode prepareForSegue
remplacée, il stocke les données transmises par la cellule au contrôleur de destination. Ainsi, si vous devez afficher des données détaillées sur la ligne, vous avez toutes les informations pertinentes, telles que les données détaillées elles-mêmes, ou un identifiant que le contrôleur de vue de destination peut utiliser pour extraire les données, par exemple, d'une base de données locale ou d'un service distant. .
Définir un protocole:
protocol MyCellDelegate {
func didTapMilk(data: MyCellData)
}
puis déclarez une propriété nommée delegate
dans la classe de cellule et appelez sa méthode didTapMilk
à partir de IBAction
class MyTableCell : UITableViewCell {
var delegate: MyCellDelegate?
var data: MyCellData!
@IBAction func didTapMilk() {
if let delegate = self.delegate {
delegate.didTapMilk(self.data)
}
}
}
Ensuite, implémentez le protocole dans votre contrôleur d’affichage de table, avec un remplacement de prepareForSegue
extension MyTableViewController : MyCellDelegate {
func didTapMilk(data: MyCellData) {
performSegueWithIdentifier("mySegueId", sender: data)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "mySegueId" {
let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController
vc.data = sender as? MyCellData
}
}
}
Bien sûr, pour que cela fonctionne, vous avez besoin d'une propriété data
sur votre contrôleur de vue de destination. Comme indiqué ci-dessus, si les détails de la ligne sont affichés, vous pouvez incorporer toutes les données requises dans votre classe MyCellData
- ou au moins ce dont vous avez besoin pour extraire les données de toute source (telle qu'une base de données locale, un service distant, etc. etc.).
Enfin, dans cellForRowAtIndexPath, stockez les données dans la cellule et définissez sa propriété delegate
sur self
:
extension MyTableViewController : UITableViewDataSource {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell
let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell
cell.data = data
cell.delegate = self
// ... other initializations
return cell
}
}
Utilisez self.performSegueWithIdentifier("yourViewSegue", sender: sender)
sous votre événement pour gérer le clic du bouton:
@IBAction func redButtonClicked(sender: AnyObject) {
self.performSegueWithIdentifier("redView", sender: sender)
}
redView
est l'identifiant de la division dans le code ci-dessus.