Caio Borsoi
Caio Borsoi

Reputation: 33

Opening specific view with navigation controller from push notication

Im trying to open a certain view from a push notification but i keep losing the nav bar and the back and next references. this what my storyboard looks like this (with the view i want to open)

enter image description here

this is what i have in my AppDelagate:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "notification") as? NotificationViewController
            self.window?.rootViewController = vc

Upvotes: 0

Views: 145

Answers (3)

EmilioPelaez
EmilioPelaez

Reputation: 19932

What you're doing is completely replacing the root view controller of your application, this means that all the current UI will be discarded.

What you should do instead is to use your knowledge of your application to direct it to the new content. For example, if your root view controller is a navigation controller, you can cast rootViewController to a nav controller and push it (this will fail if your root view controller is something else, like a tab bar controller).

guard let vc = storyboard.instantiateViewController(withIdentifier: "notification") as? NotificationViewController else {
  fatalError("Main Storyboard doesn't have a notification controller")
}
guard let nav = self.window?.rootViewController as? UINavigationController else {
  return //handle unexpected state
}
nav.push(vc, animated: true)

Another option would be to embed your notification controller into a navigation controller, add a Close button, and present it modally, that way you can present it on top of rootViewController no matter what that controller is.

Upvotes: 1

Benny Davidovitz
Benny Davidovitz

Reputation: 1202

As we can see in the screenshot your provided, the application's root view controller is the UINavigationController instance.

And according to that, let me offer the next code:

func handleNotification(){
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        guard let vc = storyboard.instantiateViewController(withIdentifier: "notification") as? NotificationViewController else{
            debugPrint("NotificationViewController with identifier 'notification' not found")
            return
        }

        guard let navVC = self.window?.rootViewController as? UINavigationController else{
            debugPrint("RootViewController is not an UINavigationController")
            return
        }

        navVC.pushViewController(vc, animated: true) //perhaps your will prefer to use false
    }

Beside that, you can use more flexible implementation.

In your AppDelegate post a (NS)Notification when notification intercepted, the relevant view-controller(s) observe the notification, and act when notification broadcasted.

You can also set an identifier to the segue and invoke performSegue method from the observing view-controller

Upvotes: 1

Anil Kumar
Anil Kumar

Reputation: 1984

You can set from storyboard -> add view controller -> Embed in navigation controller -> set second view controller -> Attach seque between that controllers. You will see same view controllers like that image .

Upvotes: 0

Related Questions