Я пишу приложение для iPhone на основе раскадровки и работаю над восстановлением штата. Обычно, когда вы выполняете segues, я хочу, чтобы они оживляли, но когда я восстанавливаю несколько уровней иерархии навигации, мне нужно только оживить последний сеанс. Помимо настройки двух наборов segues - одного набора, который использует обычный push-сегмент, а другой, который использует настраиваемый неанимационный push-segue, - есть ли способ достичь того, что я пытаюсь сделать?
Push segue без анимации
Ответ 1
Можно напрямую манипулировать стеком контроллера представления, независимо от приложений или раскадровки.
Вы можете использовать эту технику для восстановления глубокого стека контроллеров представлений и выполнить/оживить только один сеанс для контроллера верхнего уровня. (Для этой цели вам, вероятно, понадобится создать специальный push-сегмент.)
Например, чтобы восстановить два стека контроллера представления, вы можете сделать следующее. В этом примере он предположил, что некоторые действия на существующем контроллере представлений приводят к восстановлению состояния, но вы можете так же легко выполнить его из своего делегата приложения.
[self performSegueWithIdentifier:@"Page2Express" sender:self];
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Page2Express"])
{
// Get any state data you need to from Core Data
CoreDataType *valuePulledFromCoreData = // ...
// Set up the page 2 view controller as you normally would
Page2ViewController *page2ViewController = segue.destinationViewController;
page2ViewController.instanceVariable = valuePulledFromCoreData;
// Create a loose, page 1 view controller and set it up as required
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
Page1ViewController *page1ViewController = [storyboard instantiateViewControllerWithIdentifier:@"Page1ViewController"]; // Ensure you have this identifier set up in your storyboard
page1ViewController.instanceVariable = valuePulledFromCoreData;
// Add the page 1 view controller to the top of the navigation stack (to be later obscured in the segue by the page 2 view controller)
NSMutableArray *viewControllers = [[self navigationController].viewControllers mutableCopy];
[viewControllers addObject:page1ViewController];
[self navigationController].viewControllers = viewControllers;
}
}
Если вместо этого вы предпочитаете не иметь анимации, тогда это еще проще. Вы можете восстановить состояние только путем управления стеком контроллера представления (и без использования каких-либо segues) от - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
и - (void)applicationWillEnterForeground:(UIApplication *)application
.
В любом случае это будет работать без сбоев и в сочетании с существующими раскадрой (s) и segues.