Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dismissing modal view controller stack

Given the following view controller layout.

View Controller Layout

We build a stack of modal view controllers by first presenting B on A and then presenting C on B. According to the Apple documentation on dismiss(animated:completion:), calling it on A should actually dismiss the topmost view controller (C in this case) in an animated fashion and all intermediate view controllers without animation. What happens though is that C gets dismissed without animation and B is dismissed in an animated fashion.

I put up an Xcode project on GitHub that replicates that behaviour. Am I missing something or am I misunderstanding the documentation here?

like image 723
mAu Avatar asked Aug 05 '16 10:08

mAu


1 Answers

After poking around the web and trying out various 'solutions' it is clear this is an actual bug within iOS. It has been present since iOS 8... and is still present in iOS 10. It was originally reported in iOS 8, but the solution was never validated and Apple automatically closed the radar due to inactivity.

I have filed a new radar as this is in direct contradiction to the documentation for dismissViewController

If you present several view controllers in succession, thus building a stack of presented view controllers, calling this method(means -[UIViewController dismissViewControllerAnimated:completion]) 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.

Clear visualization of the issue, both expected and actual results. Credit to Boris Survorov for the test project and visualizations.

Expected ResultsActual Results iOS 8+

like image 58
MobileVet Avatar answered Sep 18 '22 01:09

MobileVet