If you drag the edge of a UIViewController
to begin an interactive pop transition within a UINavigationController
, the UIViewController
underneath the current has viewWillAppear:
called, followed by the UINavigationControllerDelegate
method navigationController:willShowViewController:animated:
.
If you cancel the transition (i.e. the dragged controller is placed back where it was and not popped), viewWillAppear:
and viewDidAppear:
are called on the top view controller as expected, but the delegate methods navigationController:willShowViewController:animated:
and navigationController:didShowViewController:animated:
aren't. It seems like at least one or both of these should be called considering the UIViewController
view lifecycle methods are called. I am wondering whether this is deliberate or a bug in UINavigationController
.
What I really need is to be able to see when an interactive pop is cancelled, either within my UINavigationController
subclass, or its UINavigationControllerDelegate
. Is there an obvious way to do this?
edit
I'm still looking for a solution to this but would like to mention that I have reported this issue as a bug with Apple. Looking at the documentation, there is no reason these delegate methods should not get called, especially considering the equivalent view lifecycle methods DO get called.
edit2
My radar ticket (16823313) was closed today (May 21st, 2015) and marked as intended. :(
Engineering has determined that this issue behaves as intended based on the following information:
This is actually the correct behavior. The navigation transition that's happening from B -> A, if you cancel it mid-transition, you won't get the didShowViewController: method. A cancellation of this transition shouldn't be considered a transition from A -> B because you never actually reached A.
view[Will/Did]Appear should still be called as expected too.
Quite a bummer this is the case as it is counterintuitive but the workaround in my answer below should work fine for the foreseeable future, at least for my use-case.