2017-10-18 1 views
2

Ich wollte View-Controller aus Push-Benachrichtigungen instanziieren, die meisten Tutorials scheinen zu empfehlen, die ID für den VC zu übergeben und sie mit dem StoryboardID abzugleichen.Erstellen Sie eine UIViewController-Klasseninstanz aus string (View-Controller-String-Name), ohne Storyboards oder NIB/XIB zu verwenden?

Problem ist meine App wird programmatisch gemacht und so kann ich Storyboard-IDs nicht hinzufügen.

Wie kann ich dies programmatisch auflösen, so dass ich einen VC über eine Zeichenfolge referenzieren kann?

Update:
Mein Punkt ist, dass, wenn die Benachrichtigung eine Zeichenfolge von was VC analysiert instanziieren z. "Deashboard" kann ich dann nicht über eine Kennung laden, die dieser Zeichenfolge entspricht, ID benötigt eine massive switch-Anweisung für jede Möglichkeit, die dann den Code in jedem Fall ausführt

+0

Haben Sie Storyboard (keine segue Verbindung) für Ihre View-Controller-Design? – Krunal

+0

nein, es ist alles programmatisch – jackdm

+0

"so kann ich einen VC referenzieren" Und wie initiieren Sie es? Sie müssen keine StoryboardID verwenden, Sie können 'MyVCForPush * vc = [[MyVCForPush alloc] init]'; 'MyVCForPush * vc = [[MeinVCForPush Alloc] initWithXibName: @someName]', dann '[vc setPushInfo: myPushInfo]', und präsentiere es dann. – Larme

Antwort

0

Wenn ein View-Controller nicht mit Storybaord oder Nib-Datei verknüpft ist, Der Standardinitiator der Klasse stellt eine Instanz des View-Controllers zur Verfügung.

dieses versuchen und sehen:

Objective-C

ViewController *viewController = [[ViewController alloc] init]; 
[self.navigationController pushViewController:viewController animated:true]; 

Swift

let viewController = ViewController() 
navigationController?.pushViewController(viewController, animated: true) 


aktualisieren
Um den String-Klassennamen in View-Controller zu konvertieren, folgen Sie der Erweiterung.

extension NSObject { 

    func viewControllerFromString(viewControllerName: String) -> UIViewController? { 

     if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String { 
      print("CFBundleName - \(appName)") 
      if let viewControllerType = NSClassFromString("\(appName).\(viewControllerName)") as? UIViewController.Type { 
       return viewControllerType.init() 
      } 
     } 

     return nil 
    } 

} 

Jetzt erhalten Sie Ihre View-Controller aus der Klasse String

if let viewController = viewControllerFromString(viewControllerName: "ViewController") as? ViewController { 
    navigationController?.pushViewController(viewController, animated: true) 
} 

Eine ähnliche Funktionalität mit String-Erweiterung:

extension String { 

    func getViewController() -> UIViewController? { 

     if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String { 
      print("CFBundleName - \(appName)") 
      if let viewControllerType = NSClassFromString("\(appName).\(self)") as? UIViewController.Type { 
       return viewControllerType.init() 
      } 
     } 

     return nil 
    } 

} 


if let viewController = "ViewController".getViewController() as? ViewController { 
    navigationController?.pushViewController(viewController, animated: true) 
} 
+0

ja das ist was ich tue, aber mein Punkt ist das wenn die Benachrichtigung eine Zeichenfolge analysiert, welche VC instanziiert werden soll, z "Deashboard" kann ich dann nicht über einen Bezeichner laden, der dieser Zeichenfolge entspricht, id brauche eine massive switch-Anweisung für jede Möglichkeit, die dann deinen Code jeweils ausführt – jackdm

+0

Versuche es mit einer aktualisierten Antwort – Krunal

+0

@Krunal was ist das für CFBundleName? Woher kommt es? – ArgaPK

Verwandte Themen