Нажмите Segue без анимации - PullRequest
13 голосов
/ 05 декабря 2011

Я пишу приложение для iPhone на основе раскадровки и работаю над восстановлением состояния.При обычном выполнении сегментов я хочу, чтобы они анимировались, но когда я восстанавливаю несколько уровней иерархии навигации, я хочу, чтобы анимировался только последний переход.Кроме установки двух наборов сегментов - один набор, который использует нормальный push-переход, и другой, который использует нестандартный push-переход без анимации, - есть ли способ достичь того, что я пытаюсь сделать?

1 Ответ

14 голосов
/ 04 января 2012

Можно напрямую манипулировать стеком контроллера представления независимо от сегментов или раскадровок приложения.

Вы можете использовать эту технику для восстановления большого стека контроллеров вида и выполнения / анимации всего лишь одного перехода к контроллеру вида сверху. (Для этой цели вам, вероятно, потребуется создать специальный 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;
     }
}

Если вместо этого вы предпочитаете не использовать анимацию, тогда все равно проще. Вы можете восстановить состояние только путем манипулирования стеком контроллера представления (и без использования каких-либо сегментов) из - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions и - (void)applicationWillEnterForeground:(UIApplication *)application.

В любом случае, все будет работать гладко и в тандеме с вашими существующими раскадровками и сегментами.

...