Given the following 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?
I am guessing that your segue from A to B is modal as well? In that case the
dismiss
function called from A wants to dismiss the view, which is immediately on top of A, which is B. C just gets hidden in order to show you the animated hiding of B. In that sense you cannot stack views via modal segues and dismiss the top one with thedismiss
function as you described if you go that far back. Thedismiss
would work as intended if called from B to dismiss C though.I've experienced the same issue and here is what I've found to be a viable workaround. When you need to dismiss the whole stack, execute this code in A:
This should result with the expected behavior.
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
Clear visualization of the issue, both expected and actual results. Credit to Boris Survorov for the test project and visualizations.