Search code examples
objective-cuistoryboardtvos

tvOS - dismissing to top of storyboard causes all intermediate screens to -viewWillAppear/Disappear


I am several levels deep in a storyboard and want to unroll everything all the way back to the first screen. Fortunately, there are APIs designed to do exactly this:

UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
[topController dismissViewControllerAnimated:NO completion:nil];

However, this method seems to "unroll" the view stack one by one, causing each view between my current position and the first screen to briefly invoke viewWillAppear, viewDidAppear, viewWillDisappear, and viewDidDisappear. This causes a cacophony of activity in my app, as most of the intermediate screens do interesting things when they appear. I can set breakpoints in Xcode and watch these methods get invoked in reverse order back to the main screen.

I need a way to pop back to the start of the storyboard without causing every screen along the path to light up and do work.

If this means I cannot use viewWillAppear for this purpose any more, I am willing to switch to a replacement method as long as one exists.


Solution

  • This is expected behaviour. I assume you're presenting the layers of views with presentViewController... calls on each previous view.

    You should look at using a UINavigationController as your top level view instead. Then you can just call popToRootViewControllerAnimated: when you want to go all the way back.