1

Je travaille avec des notifications locales et j'essaye de présenter un viewController spécifique mais j'ai essayé ce que j'ai trouvé dans ce forum et j'ai eu un comportement inhabituel avec la vue montrée dans this picture here: Et voici le code source de AppDelegate.swift:Présente un contrôleur de vue spécifique de l'action de notification

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

    print("didReceive Method called") 

    if response.actionIdentifier == "actionOne" { 
     DispatchQueue.main.async(execute: { 
      self.notificationAction1() 
     }) 
    } else if response.actionIdentifier == "actionTwo" { 
     DispatchQueue.main.async(execute: { 
      self.notificationAction2() 
     }) 

    } else if response.actionIdentifier == "actionThree" { 

    } 
    completionHandler() 
} 

func notificationAction1() { 
    redirectToVC() 
} 

func redirectToVC() { 
    let toVC = VersesViewController() 
    if self.window != nil && self.window?.rootViewController != nil { 
     let rootVC = self.window?.rootViewController! 
     if rootVC is UINavigationController { 
      (rootVC as! UINavigationController).pushViewController(toVC, animated: true) 
     } else { 
      rootVC?.present(toVC, animated: true, completion: { 
       //Do something 
      }) 
     } 
    } 
} 

Quel est le problème avec le code (en particulier la méthode redirectToVC())? Toute aide sera appréciée.

+0

Cela fonctionne actuellement? – Mannopson

+0

Regardez l'image au-dessus du code source, le contrôleur de vue est vide ce qu'il n'est pas censé être. –

Répondre

1

Je viens de trouver une réponse à cette question. Il s'agit essentiellement de présenter un contrôleur de vue à partir de AppDelegate.

func redirectToVC() { 
    let mainStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let initialViewController: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "versesVC") as UIViewController 
    self.window = UIWindow(frame: UIScreen.main.bounds) 
    self.window?.rootViewController = initialViewController 
    self.window?.makeKeyAndVisible() 
} 

Merci à Opening view controller from app delegate using swift

+0

Cela fonctionne parfaitement? – Mannopson

+0

J'ai également défini rootViewController comme ceci mais le problème est mon rootView par défaut est une vue d'animation luncher. Il montrera une animation et ensuite il redirigera vers une autre vue et la définira comme rootView. Mais quand je réinitialise mon rootView dans 'réponse de didReceive:' il montre ce ViewController spécifique pour un coup d'oeil et retourne ensuite à l'ancien rootViewController. Comment puis-je l'empêcher de revenir à l'ancien rootViewController? –

0

Chaque fois que vous devez présenter un contrôleur de vue spécifique sur l'écran actuel, il est peu importe si vous affichez-contrôleur poussé à travers la navigation ou pourrait être présenté, dans les deux cas, vous pouvez utiliser ci-dessous code pour résoudre votre problème.

    var appdelgateObj = UIApplication.shared.delegate as! AppDelegate 
        if let destinationVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: “ToPresentVC”) as? ToPresentVC { 
         if let window = appdelgateObj.window , let rootViewController = window.rootViewController { 
          var currentController = rootViewController 
          while let presentedController = currentController.presentedViewController { 
           currentController = presentedController 
          } 
          currentController.present(destinationVC, animated: true, completion: nil) 
         } 
        }