2016-09-06 1 views
0

Ich präsentiere einen Ansichtscontroller modal als benutzerdefinierten Popover aus einer Tabellenansicht mit didSelectRowAtIndexPath und prepareForSegue. Die Daten auf dem nächsten Ansichtscontroller geben jedoch null zurück. Ich habe das Problem darauf beschränkt, die Daten durch das Protokoll selbst zu leiten. Im Folgenden werde ich den relevanten Code für beide View-Controller und das Protokoll einschließen.Daten, die als Null nach dem Durchlaufen des Protokolls zum nächsten Ansichtscontroller zurückgegeben werden

First View Controller:

protocol barTableViewControllerDelegate { 
    func acceptData(data: AnyObject!) 
} 

class barTableViewController: UITableViewController, CLLocationManagerDelegate { 
    var delegate: barTableViewControllerDelegate? 
    var data: AnyObject? 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("yes") 
     let classIndexPath = self.tableView.indexPathForSelectedRow! 
     print(classIndexPath.row) 
     print("yes2") 
     let selectedClass = names[classIndexPath.row] 
     print("yes3") 
     print(names[classIndexPath.row]) 
     self.delegate?.acceptData(selectedClass) 
     self.performSegueWithIdentifier("showAd", sender: self) 
    } 


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if(segue.identifier == "showAd") { 
      /* if let objIndexPath = self.tableView.indexPathForSelectedRow?.row { 
      let obj = queryArray[objIndexPath] 
      let navVC = segue.destinationViewController as! UINavigationController 
      let detailVC = navVC.topViewController as! DetailViewController 
      detailVC.post = obj */ 
      print("is segue working") 
      let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("adPopUp") as! PopUpViewController 
      self.addChildViewController(popOverVC) 
      popOverVC.view.frame = self.view.frame 
      self.view.addSubview(popOverVC.view) 
      popOverVC.didMoveToParentViewController(self) 
      print("segue working") 
     } 
    } 

Second-View-Controller:

class PopUpViewController: UIViewController { 

    func acceptData(data: AnyObject!) { 
     self.post = data! as! String 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("here") 
     print(post) 
     print(self.post) 
     print("here2") 
    } 
} 

log screenshot

Das letzte Protokoll gedruckt ist here. Stops bei print(post). Ich glaube nicht, dass ich Daten im zweiten View-Controller deklarieren muss?

+0

Wird die 'acceptData' Methode aufgerufen? Es ist möglich, dass "delegate" in "barTableViewController" gleich null ist. – Eluss

+0

@Eless acceptData-Methode wird im Protokoll im ersten Ansichtscontroller oberhalb der Klasse deklariert. Es wird im zweiten View-Controller oberhalb der viewDidLoad-Methode aufgerufen. Könnten Sie bitte erläutern, wie/warum der Delegat in barTableViewController null ist? – boppa

Antwort

0

Wenn Sie forward gehen, benötigen Sie das Protokoll nicht. Sie können einfach legen Sie die nächste Ansicht Controllers Variable in prepareForSegue

class barTableViewController: UITableViewController, CLLocationManagerDelegate {   

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     let classIndexPath = self.tableView.indexPathForSelectedRow! 
     let selectedClass = names[classIndexPath.row] 
     self.performSegueWithIdentifier("showAd", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if(segue.identifier == "showAd") { 
      let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("adPopUp") as! PopUpViewController 

      popOverVC.data = selectedClass // <-- Set the variable in the next VC 

      self.addChildViewController(popOverVC) 
      popOverVC.view.frame = self.view.frame 
      self.view.addSubview(popOverVC.view) 
      popOverVC.didMoveToParentViewController(self) 
     } 
    } 
} 

class PopUpViewController: UIViewController { 

    var data: String! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let passedData = data { 
      self.post = passedData 
     } 
    } 
} 
+0

so eine einfache Lösung und es hat perfekt funktioniert. Danke für die Klarstellung – boppa

+0

@boppa Gern geschehen. Wenn Sie die Daten zurückleiten möchten, z. B. wenn Sie das Popup-Fenster schließen, verwenden Sie einen Delegaten – Shades

0

Die Art und Weise Sie segue verwenden falsch ist, sollten Sie nicht die popOverVC in prepareForSegue initialisieren, auch sollten Sie nicht Sicht transitioning tun (setFrame, addSubview) in prepareForSegue als Gut. UIStoryboardSegue hat eine Eigenschaft namens destinationViewController, die in Ihrem Fall die popOverVC ist. Und wenn Sie benutzerdefinierte Übergänge zwischen der Quelle (barTableViewController) und dem Ziel (popOverVC) vornehmen möchten, müssen Sie die Klasse UIStoryboardSegue ableiten, die Methode perform überschreiben und alles dort tun.

Verwandte Themen