2016-09-25 1 views
2

aufrufen Ich habe gelesen this thread (und ähnliche andere) von unten nach oben, aber es passt überhaupt nicht meine Bedürfnisse.Swift/wie Delegat mit popViewController

Ich habe eine UIViewController innerhalb UIPageViewController innerhalb einer UINavigationController. Navigieren zu einem zweiten ViewController. Zu einem dritten ViewController navigieren und zum zweiten ViewController zurückkehren, der Daten liefert.

Mein Code zur Zeit:

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

Mein 2. VC:

class My2ndVC: UIViewController, PassClubDelegate { 

    var club = Club() 

    func passClub(passedClub: Club) { 

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

passClub wird nicht aufgerufen. Ich bin mir sicher, dass ich den Delegaten nicht auf My2ndVC gesetzt habe, aber wie würde ich das tun? Alle Lösungen, die ich gefunden haben möchte, verwenden ich a) segue oder b) instantiiert ein My2ndVC neu, was keinen Sinn macht, da es immer noch im Speicher ist und ich zurück in die Hierarchie zurückkehren möchte. Was vermisse ich? Was sind meine Möglichkeiten? Hilfe wird sehr geschätzt.

PS: Ich benutze keine segues. My3rdVC heißt von:

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

Antwort

3

Sie haben die Delegierten von My3rdVC im prepareForSegue Methode von My2ndVC einstellen.

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

Dies wird vorausgesetzt, Sie eine segue in Ihrem Storyboard erstellt haben, die My3rdVC von My2ndVC auf die Navigationssteuerung Stapel schiebt, die ich Sie gehe davon aus. Also versuchen Sie einfach diese prepareForSegue Methode in My2ndVC einfügen und sehen, ob es funktioniert.

UPDATE

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

vc.passClubDelegate = self 

navigationController?.pushViewController(vc, animated: true) 
+0

Ich verwende keine segues. –

+0

aber natürlich, upvote für Ihre Mühe. Danke –

+0

Sie können den Delegierten übergeben, nachdem Sie 'My3rdVC' instanziiert haben, aber bevor Sie ihn auf den Navigationscontroller-Stack – Callam