2016-04-28 8 views
0

Durch Drücken einer UIButton in einem UIViewController (Detailansicht eines Splitview-Controllers) wird ein UITableViewController geöffnet, der als Popover angezeigt wird. Dies wird durch einen Übergang erreicht, und "Art" wird im Attributinspektor als "Präsentieren als Popover" festgelegt. Wenn eine UITableViewCell im UITableViewController ausgewählt ist, möchte ich, dass der UIViewController diese Auswahl abfängt.Zugriff auf übergeordneten Ansichtscontroller über Popover in swift über Storyboard

Dies ist, was ich in der UITableViewController zu tun versuche:

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

     let cell = tableView.cellForRowAtIndexPath(indexPath) 
     let myViewController = presentingViewController as! MyViewController 

     myViewController.variable = cell.someProperty 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 

Dies gibt im Protokoll: „Fataler Fehler: unerwartet gefunden null, während ein optionaler Wert auszupacken“, was darauf hinweist, dass ich nicht die fangen Elternteil/Präsentation. Nachdem ich über Popovers gelesen habe, sollte ich einen Delegierten implementieren und Methoden delegieren. Aber ich verstehe nicht, wie und wie.

Was ist der richtige Weg, dies zu tun?

+0

tun Sie einfach als dies ,,, MYViewController.Variable = cell.someProperty .. –

+0

Danke für Ihren Vorschlag, aber das funktioniert nicht. –

Antwort

1

Wahrscheinlich möchten Sie das Delegationsentwurfsmuster verwenden. Wenn ich Ihre Situation richtig verstehen, können Sie erreichen, dass durch so etwas wie tun:

class MyTableViewController: UITableViewController { 
    // ... 

    weak var myViewControllerDelegate: MyViewController? // Make sure it's weak! .. or you know what you're doing, haha 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     // ... 
     let property = 5 // cell.property 
     self.myViewControllerDelegate?.myTableViewController(self, didSelectCellWithProperty: property) 
    } 
} 

class MyViewController: UIViewController { 
    // ... 

    // In viewDidLoad or elsewhere, if necessary 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     //... 

     myTableVCInstance.myViewControllerDelegate = self // This will set the delegate we created to self 
    } 

    func myTableViewController(viewController: MyTableViewController, didSelectCellWithProperty property: Int) { 
     // ... 
    } 
} 

Beachten Sie die Benennung von myViewControllerDelegate, um nicht mit dem delegate die UITableViewController bereits, kollidieren die vom Typ UITableControllerDelegate sein würde.

Dieses Beispiel soll einen Punkt zeigen. Sie würden wahrscheinlich ein Protokoll verwenden, um es zu bereinigen.

+0

Danke. Dies scheint ein sehr guter Ersatz für NSNotification zu sein und könnte viele Probleme lösen, die ich habe. Ich bin jedoch nicht in der Lage, das Eigentum zu erfassen. Hinzufügen von "print (property)" print ("Hi") innerhalb von func myTableViewController (ViewController: MyTableViewController, didSelectCellWithProperty Eigenschaft: Int) { // ... } druckt nichts, wie die Methode nie aufgerufen wurde. –

+1

Vielleicht verstehe ich das nicht. Versuchen Sie, eine Eigenschaft der Zelle an MyViewController zu senden? –

+0

Ja, oder eine Eigenschaft aus dem TableView-Controller überhaupt. –