2017-11-24 4 views
0

Die Situation: wenn ich eine Taste in rentViewController drücke, erscheint ein Tableview-Controller. Wenn eine bestimmte Zelle gedrückt wurde, sendet sie Daten an rentViewController. Um brauchte ich die Codedaten von einem View-Controller zu einem anderen zu sendenKonnte den Wert vom Typ 'UITabBarController' nicht in 'ViewController' umwandeln

let rentViewController : RentViewController = self.presentingViewController as! RentViewController < - hier ist, wo der Fehler

zeigt, so dass Tableviewcontroller Zugriff auf die Variablen und Funktionen von rentviewcontroller bekommen kann. Ich benutze

self.dismiss(animated: true, completion: nil) 

aus dem tableviewcontroller und zurück zum rentviewcontroller. Es gibt mir jedoch einen Fehler "Konnte den Wert des Typs 'UITabBarController' nicht in 'RentViewController' umwandeln". Ich habe etwas recherchiert und denke, dass es den Anweisungen meiner View-Controller entspricht, aber ich bin mir nicht sicher, wie ich es so ändern kann, dass es funktioniert. Meine erste Ansicht ist 'TabBarController' und die Reihenfolge danach ist 'NavigationController' -> 'RentViewController' -> 'TableViewController'. Wenn Sie Fragen haben, zögern Sie nicht, ich kann Ihnen weitere Informationen geben.

Antwort

0

Ihr viewController wird von UITabBarController präsentiert. Mit Ansatz Sie verwenden glauben, dass ich Sie es wie folgt zugreifen können (wobei der Index ist Index in UITabBarController Ihrer UINavigationController enthält RentVC):

if let tab = self.presentingViewController as? UITabBarController, 
    let nav = tab.viewControllers?[index] as? UINavigationController,  
    let rentViewController = nav.viewControllers.first as? RentViewController { 

     rentViewController.data = data 
} 

Allerdings würde ich vorschlagen, einen Delegaten oder Callback-Block unter Verwendung von Daten in diese passieren Gelegenheit.

Für Delegat Ansatz, zuerst erstellen Protokoll:

protocol PassDataDelegate:class { 
    func passData(data:YourType) 
} 

Dann in Tableviewcontroller:

class TableViewController: UIViewController { 
    weak var delegate: PassDataDelegate? 
} 

Und in RentViewController:

extension RentViewController: PassDataDelegate { 
    func passData(data:YourType) { 
     //use data to suit your needs 
    } 
} 

Bevor Tableviewcontroller präsentiert, in RentViewController, stellen ihre Delegierter:

tableViewController.delegate 
present(tableViewController, animated: true) 

Und schließlich innerhalb Tableviewcontroller, vor Entlassung, Methode Aufruf Delegat passieren Daten:

delegate?.passData(data: <<someData>>) 
+0

die erste Methode ausprobiert und es funktionierte! Ich danke dir sehr. Aus welchem ​​Grund schlagen Sie vor, delegate zum Übergeben von Daten zu verwenden? –

+0

Es ist sauberer Weg, dann auf Abruf Reihenfolge zu verlassen. Wenn Sie sich zum Beispiel später dazu entschließen, TableViewController von einem anderen Punkt in der App aus darzustellen, würde die Delegierung immer noch funktionieren, während dies abhängig von der Hierarchie nicht möglich ist. –

Verwandte Themen