В этом случае было бы лучше сохранить ваши контроллеры представления и затем показать их снова, как только вы захотите вернуться туда, где вы были. В любой момент вы можете получить текущие контроллеры представления, использующие navigationController.viewControllers
. И для установки всего стека все, что вам нужно сделать, это вызвать setViewControllers
на вашем контроллере навигации.
Вы можете переопределить контроллер навигации, чтобы сохранить массив контроллеров. Или вы можете просто сохранить его статически. Что удобнее в вашем случае.
Статический будет выглядеть примерно так:
static NSArray<UIViewController *> *__preservedControllers = nil;
@implementation ViewController
- (void)onClose {
__preservedControllers = self.navigationController.viewControllers;
// Insert logic to close the whole procedure
}
- (void)reopenSavedStack {
if(__preservedControllers) {
[self.navigationController setViewControllers:__preservedControllers animated:YES];
__preservedControllers = nil;
}
}
С субклассом контроллера навигации это может выглядеть намного лучше, хотя:
@interface MyNavigationController : UINavigationController
@property (nonatomic, strong) NSArray<UIViewController *> *savedStack;
@end
@implementation MyNavigationController
- (void)saveStack {
self.savedStack = self.viewControllers;
}
- (void)restoreStack:(BOOL)animated {
if(self.savedStack.count > 0) {
[self setViewControllers:self.savedStack animated:YES];
self.savedStack = nil;
}
}
@end
Но тогда вам нужно набрать еще раз:
- (void)onClose {
[(MyNavigationController *)self.navigationController saveStack];
// Insert logic to close the whole procedure
}
- (void)reopenSavedStack {
[(MyNavigationController *)self.navigationController restoreStack:YES];
}