0

Je veux ouvrir un ViewController spécifique de la TabBarController chaque fois qu'une notification locale est tiré et leur action personnalisée est effectuée. Je l'ai utilisé la ligne suivante de Code:Présenter un ViewController spécifique du 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() 
} 

Il est donc fonction first():

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() 

} 

fonction Deuxième : 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() 

} 

Et ça fonctionne bien, mais je ne peux pas ouvrir le deuxième ViewController alors que le premier est présenté et la deuxième notification est tiré: Dans la console: tentative d'avertissement pour présenter ViewController ...

Répondre

1

Utilisez ceci:

tabBarController.selectedIndex = 1 

Où peut être l'un des viewcontrollers présenté par votre tabBarController

+0

Cela semble inutile. Il retourne seulement 1 – Mannopson

+1

Il n'a rien à retourner. Si vous définissez selectedIndex sur n'importe quel nombre, la barre d'onglets changera son onglet en index sélectionné. Si vous définissez selectedIndex = 0, vous passerez au premier onglet. selectedIndex = 1, deuxième onglet. Et ainsi de suite –

+0

Merci pour votre aide. Je n'ai aucune expérience avec la classe UITabBarController. – Mannopson

1

Je avais rencontré un problème similaire et de changer le selectedIndex fait ne travaille pas pour moi. En fonction des besoins de votre projet, vous pouvez instancier votre ViewController et l'ajouter comme Subview et passer à Subview. Lorsque vous avez terminé, assurez-vous d'enlever ce Subview.

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

Comment c'est fait? Où dois-je appeler ces codes? – Mannopson

+1

À l'intérieur de l'action que vous souhaitez modifier avec ViewController. Si c'est une action de bouton, alors appelez le code ci-dessus dans l'action des boutons. –

+0

Merci beaucoup! – Mannopson