2016-06-29 13 views
1

Ich habe ein Storyboard und View-Controller drin. Die Storyboard-ID jedes View-Controllers entspricht dem zugewiesenen Klassennamen. like: einem Walkthrough-View-Controller wird die Klasse WalkThroughVC zugewiesen, und seine Storyboard-ID ist ebenfalls WalkThroughVC.Infer-Typ zu Generika von Funktion Rückgabetyp

Ich habe eine Funktion unten, um Instanz von View-Controller von Storyboard zu erhalten:

func getViewController<T: UIViewController>() -> T? { 
    let sb = UIStoryboard(name: "Main", bundle: nil) 
    sb.instantiateViewControllerWithIdentifier(viewController.rawValue) as? T 
} 

Ist es möglich, die Art der T zu schließen? Wenn ja, wie?

Antwort

0

Ich denke, was Sie suchen.

class ViewControllers 
{ 
    class func getViewController<T : UIViewController>(fromStoryboard : String, fromClass : T) -> T? 
    { 
     let storyboard = UIStoryboard(name: fromStoryboard, bundle: nil) 
     let controller = storyboard.instantiateViewControllerWithIdentifier("\(fromClass)") as? T 
     return controller 
    } 
} 
+0

Diese Lösung hat nicht funktioniert "\ (fromClass)" wird nicht der Klassenname geben statt „verwenden \ (fromClass.classForCoder) "gibt den Klassennamen an. – Dari

0

Versuchen Sie folgendes:

func getViewController<T: UIViewController>() -> T? { 
     var fullName: String = NSStringFromClass(T.self) 
     let range = fullName.rangeOfString(".", options: .BackwardsSearch) 
     if let range = range { 
      fullName = fullName.substringFromIndex(range.endIndex) 
     } 
     let sb = UIStoryboard(name: "Main", bundle: nil) 
     return sb.instantiateViewControllerWithIdentifier(fullName) as? T 

    } 
+0

Bitte versuchen Sie dies und lassen Sie mich wissen, wenn funktioniert –

+0

können Sie Beispiel geben, wie können wir diese Funktion verwenden? Ankommender Typ zum T – Dari

0

ich nicht auf diese Weise ableiten könnte. Keine Lösung noch I verwendet Alternative folgende:

func getViewController<T: UIViewController>(ofType: T.Type) -> T? { 
    let sb = UIStoryboard(name: "Main", bundle: nil) 
    sb.instantiateViewControllerWithIdentifier("\(ofType)") as? T 
} 

und ich benutzte es als:

let viewController = getViewController(WalkThroughVC)