Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a presented view controller also be a presenting view controller?

On top of an existing view I want to: a) display a screen to the user b) then send an SMS c) display another screen to the user.

For a) I am doing this:

[[UIApplication sharedApplication].delegate.window.rootViewController presentViewController: firstController animated: NO completion:nil];

and for b) I am doing the same thing, except this is presenting a different vc of course, a MFMessageComposeViewController.

However in order for b) to appear I first have to dismiss the first view controller using:

   [[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:NO completion: nil];

That works so far, I can see the first view appear then see the SMS compose view appear. When the SMS is sent I am doing this to dismiss the SMS compose view

   [[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:NO completion: nil];

But then nothing happens when I try to present another screen to the user using presentViewController. I can't see any reason why this should be, is there something I'm not aware of?

Actually the screen before the SMS view and after it are the same except they have different text, so the easiest sequence of steps would be:

a) present the view controller with text "abc" b) present the SMS controller c) when the SMS is sent dismiss the SMS controller d) update the text in the first view controller using an IBOutlet e) dismiss the first view controller.

However as mentioned earlier on, if I don't dismiss the first view controller the SMS controller will not appear. So my main question is how can I present the SMS controller on top of the first view controller?

like image 768
Gruntcakes Avatar asked Apr 23 '12 21:04

Gruntcakes


People also ask

What is a Presentingviewcontroller in Swift?

The view controller that is the starting point for the presentation.

What is the difference between view controller and view?

The view renders presentation of the model in a particular format. The controller responds to the user input and performs interactions on the data model objects. The controller receives the input, optionally validates it and then passes the input to the model.

What is the most important role of a view controller?

The most important role of a view controller is to manage a hierarchy of views. Every view controller has a single root view that encloses all of the view controller's content. To that root view, you add the views you need to display your content.

How do I turn off presented view controller?

When it comes time to dismiss a presented view controller, the preferred approach is to let the presenting view controller dismiss it. In other words, whenever possible, the same view controller that presented the view controller should also take responsibility for dismissing it.


2 Answers

You can either present one after the other closes:

UIViewController *rvc = [UIApplication sharedApplication].delegate.window.rootViewController;
[rvc dismissViewControllerAnimated:NO completion:^{
    [rvc presentViewController: secondController animated: NO completion:nil];
}];

Or present another on top:

UIViewController *rvc = [UIApplication sharedApplication].delegate.window.rootViewController;
UIViewController *pvc = rvc.presentedViewController;  // you may need to loop through presentedViewControllers if you have more than one
[pvc presentViewController: secondController animated: NO completion:nil];
like image 126
Aaron Brager Avatar answered Nov 15 '22 16:11

Aaron Brager


I just tried it on iOS15. Yes a presented VC can present another VC.

So suppose you have:

VC1 --> present--> VC2

you can easily call present(VC3(), animated: true, completion: nil) on VC2 and things would work fine. You can happily end up with:

VC1 --> present--> VC2 --present--> VC3

FWIW when you dismiss VC3, it will only go back to VC2. It won't go back to VC1.

like image 21
mfaani Avatar answered Nov 15 '22 18:11

mfaani