2 votes

Swift / comment appeler un délégué avec popViewController

J'ai lu ce fil (et d'autres similaires) de bas en haut, mais il ne correspond pas du tout à mes besoins.

J'ai un UIViewController à l'intérieur de UIPageViewController dans un UINavigationController . Naviguer vers un 2e ViewController . Je navigue vers un troisième ViewController et je veux revenir au 2e ViewController pour lui transmettre des données.

Mon code actuel :

protocol PassClubDelegate {
            func passClub(passedClub: Club)
        }

class My3rdVC: UIViewController {

        var clubs: [Club] = []

        var passClubDelegate: PassClubDelegate?

....

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let club = clubs[indexPath.row]
        self.passClubDelegate?.passClub(club)
        navigationController?.popViewControllerAnimated(true)
    }

Mon 2ème VC :

class My2ndVC: UIViewController, PassClubDelegate {

    var club = Club()

    func passClub(passedClub: Club) {

        SpeedLog.print("passClub called \(passedClub)")
        club = passedClub
    }

passClub n'est pas appelé. Je suis sûr que c'est parce que je n'ai pas défini le délégué au My2ndVC, mais comment faire ? Toutes les solutions que j'ai trouvées veulent que j'utilise a) la segue ou b) l'instanciation d'un nouveau My2ndVC, ce qui n'a aucun sens puisqu'il est toujours en mémoire et que je veux faire un pop back pour remonter dans la hiérarchie. Qu'est-ce qui me manque ? Quelles sont mes possibilités ? Toute aide est la bienvenue.

PS : Je n'utilise pas de séquences. My3rdVC est appelé par :

let vc = stb.instantiateViewControllerWithIdentifier("My3rdVC") as! My3rdVC
self.navigationController?.pushViewController(vc, animated: true)

4voto

Callam Points 7707

Vous pouvez définir le délégué de My3rdVC dans le prepareForSegue méthode de My2ndVC .

class My2ndVC: UIViewController, PassClubDelegate {

    ...

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        super.prepareForSegue(segue, sender: sender)

        switch segue.destinationController {
        case let controller as My3rdVC:
            controller.passClubDelegate = self
        }
    }
}

Cela suppose que vous avez créé une transition dans votre storyboard qui pousse My3rdVC de My2ndVC sur la pile de contrôleur de navigation, que je suppose que vous avez. Donc essayez simplement de coller ceci prepareForSegue dans la méthode My2ndVC et voir si ça marche.

UPDATE

let vc = stb.instantiateViewControllerWithIdentifier("My3rdVC") as! My3rdVC

vc.passClubDelegate = self

navigationController?.pushViewController(vc, animated: true)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X