0

Ich möchte eine spezifische ViewController von der TabBarController immer wenn eine lokale Benachrichtigung ausgelöst wird und ihre benutzerdefinierte Aktion ausgeführt wird. Ich habe folgende Zeile von Code verwendet:Präsentieren Sie einen bestimmten ViewController von der TabBarController

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 

    switch response.actionIdentifier { 
    case "first": 
     DispatchQueue.main.async(execute: { 
      self.first() 
     }) 
    case "second": 
     DispatchQueue.main.async(execute: { 
      self.second() 
     }) 
    default: 
     break 
    } 


    completionHandler() 
} 

So ist es ein first()Funktion:

func first() { 


    let storyboard = UIStoryboard.init(name: "Main", bundle: nil) 
    let tabBarController = storyboard.instantiateViewController(withIdentifier: "Root") as! UITabBarController 
    let navigationController = storyboard.instantiateViewController(withIdentifier: "First") as! UINavigationController 

    tabBarController.present(navigationController, animated: true) { 

    } 

    self.window = UIWindow.init(frame: UIScreen.main.bounds) 
    self.window?.tintColor = UIColor(red: 0.0, green: 0.5, blue: 0.0, alpha: 1.0) 
    self.window?.rootViewController = tabBarController 
    self.window?.makeKeyAndVisible() 

} 

Zweite Funktion: second()

func second() { 


    let storyboard = UIStoryboard.init(name: "Main", bundle: nil) 
    let tabBarController = storyboard.instantiateViewController(withIdentifier: "Root") as! UITabBarController 
    let navigationController = storyboard.instantiateViewController(withIdentifier: "Second") as! UINavigationController 

    tabBarController.present(navigationController, animated: true) { 

    } 

    self.window = UIWindow.init(frame: UIScreen.main.bounds) 
    self.window?.tintColor = UIColor(red: 0.0, green: 0.5, blue: 0.0, alpha: 1.0) 
    self.window?.rootViewController = tabBarController 
    self.window?.makeKeyAndVisible() 

} 

Und es funktioniert gut, aber ich kann das nicht öffnen zweite ViewController während der ersten wird vorgestellt und die zweite Benachrichtigung abgefeuert wird: In der Konsole: Warnung Versuch Viewcontroller zu präsentieren ...

Antwort

1

verwenden:

tabBarController.selectedIndex = 1 

Wo kann Seien Sie eine der viewcontrollers von Ihrem tabBarController

+0

Es scheint zu nutzlos. Es gibt nur 1 – Mannopson

+1

Es muss nichts zurückgeben. Wenn Sie selectedIndex auf eine beliebige Zahl setzen, ändert sich die Registerkarte der Registerkarte in den ausgewählten Index. Wenn Sie selectedIndex = 0 setzen, wechseln Sie zur ersten Registerkarte. selectedIndex = 1, zweite Registerkarte. Und so weiter –

+0

Danke für Ihre Hilfe. Ich habe keine Erfahrung mit der UITabBarController-Klasse. – Mannopson

1

präsentierten Ich hatte in einem ähnlichen Problem aufgetreten und die wurde geändert nicht für mich arbeiten. Abhängig von den Anforderungen Ihres Projekts können Sie Ihren ViewController instanziieren und es als Subview hinzufügen und zu diesem Subview wechseln. Wenn du fertig bist, entferne das Subview.

let replyView = self.storyboard?.instantiateViewControllerWithIdentifier("replyView") 
    self.addChildViewController(replyView!) 
    self.view.addSubview(replyView!.view) 
    replyView!.didMoveToParentViewController(self) 
+0

Wie es gemacht wird? Wo sollte ich diese Codes nennen? – Mannopson

+1

Innerhalb welcher Aktion Sie den 'ViewController' mit ändern möchten. Wenn es eine Tastenaktion ist, dann rufe den obigen Code in der Tastenaktion auf. –

+0

Vielen Dank! – Mannopson

Verwandte Themen