web-dev-qa-db-fra.com

Swift: le bouton déclenche la transition vers une nouvelle scène

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. enter image description here

20
skyguy

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)
}
30
AlBlue

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
    }
}
15
Antonio

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.

0
Aks