开发者

Problem dismissing multiple modal view controllers

I am having trouble getting my modal view controllers to display properly. I have a parent view controller that is the delegate for modal vi开发者_如何转开发ew A. In modal view A I am presenting modal view B, and having the delegate dimiss modal view A.

When modal view B appears it seems to display but the screen dims, and the UI locks up, but the app doesn't crash. I set animation settings to NO and I am still getting the same issue.

Order of events:

  1. Parent View show Modal View A
  2. Modal View A shows Modal View B in Modal View A controller
  3. Parent View dismisses Modal View A in Modal View A controller via delegation
  4. This is where my UI hangs, I can see Modal View B but can't click on it, or do anything


You could use this

[[[self presentingViewController] presentingViewController]  dismissModalViewControllerAnimated:YES];


A modal view controller must have a parent view controller in order to display. If you dismiss the parent view controller ("modal view A", in your case), behavior will be unpredictable.

If you're certain that nested modal view controllers are what you really want, you'll need to dismiss them in reverse order; wait until you're done with "B", then dismiss "B", then dismiss "A".

If you don't need the modal presentation style, you would be better off using a UINavigationController to maintain your stack of view controllers.

Update: here is how I would rearrange your order of events. Presented as code for clarity.

  1. [parentView presentViewController:modalViewControllerA animated:YES]
  2. [modalViewControllerA presentViewController:modalViewControllerB animated:YES]
  3. [modalViewControllerA dismissModalViewControllerAnimated:YES]
  4. [parentView dismissModalViewControllerAnimated:YES]


Solved by having my parentViewController act as the delegate. Here is my order:

[parentView presentViewController:modalViewControllerA animated:YES]
[parentView dismissModalViewControllerAnimated:YES]
[parentView presentViewController:modalViewControllerB animated:YES]
//Modal B dismisses himself

In my delegate method, I needed to make sure that I dismissed Modal A before presenting Modal B


For iOS 6+ and - presentViewController:animated:completion:

[[[self presentingViewController] presentingViewController]  dismissViewControllerAnimated:YES completion:nil];


in Swift 2.1

you can try

self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

works for me

View A -> View B -> View C

Apply this code in view C , you will be landing to View A


I have a main view and need to show a modalview1 where a button present a modalview2. Looks the same you needed. But there is a button in the modalview2 which forwards to the main view.

So the solution is: Main view presents UINavigationController with modalview1 as rootController. Then modalview1 present modalview2 by "[self.navigationController modalview2 animated:YES];".

When modal2 needs to forward to the main view, just make "[self.parentViewController dismissModalViewControllerAnimated:YES];" and UINavigationController is hidden.

Hope it's clear.


Simple:

Dismiss all views:

[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];

(one for each added modal view)

then present a new modal view controller


may be after long but.. I am in same problem and this is the only post with some answer. I am not getting what you mean by setting delegate of a parentViewController to self is not allowed .

what I am doing right now is

[self presentModalViewController:ViewControllerA animated:YES];
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerA
[self presentModalViewController:ViewControllerB animated:YES];
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerB

Problem is after viewControllerA , viewControllerB view is not presenting.

Thanks,


Apple document about dismiss(animated:completion:) method.

In section Discussion, it said:

any intermediate view controllers are simply removed from the stack.

If you present several view controllers in succession, thus building a stack of presented view controllers, calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion; any intermediate view controllers are simply removed from the stack. The top-most view is dismissed using its modal transition style, which may differ from the styles used by other view controllers lower in the stack.

In other words, if the view controller stack like following

Root -> A -> B -> C -> D ... -> Z

D calls dismiss method, all view controllers behide D, ex: (E ... Z), will be removed from the stack.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜