2011-12-05 42 views
13

我正在寫一個基於故事板的iPhone應用程序和國家恢復工作。正常執行segues時,我希望讓它們具有動畫效果,但是當我恢復導航層次結構的多個級別時,我只希望最後一個segue進行動畫製作。除了設置兩套賽格 - 一套使用正常推塞格式,另一套使用自定義非動畫推塞格式 - 有什麼方法可以實現我想要做的?推動沒有動畫的賽格

回答

14

可以直接操縱視圖控制器堆棧,而不管應用程序的segues或storyboard。

您可以使用這種技術來恢復視圖控制器的深層堆棧,並執行/動畫化一個單獨的視圖到頂部視圖控制器。 (您可能需要爲此創建特定的推送隊列。)

例如,要還原兩個視圖控制器堆棧,可以執行以下操作。在這個例子中,假設現有視圖控制器上的某些操作導致了狀態還原,但您可以輕鬆地從App Delegate執行該操作。

[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的視圖控制器堆棧(並且不使用任何段落)來恢復狀態。

無論哪種方式,將無縫地與您現有的故事板和賽段一起工作。

+0

出於興趣,是否有理由操縱'viewControllers'數組而不是使用'pushViewController:animated:'? –

+4

'pushViewController:animated:'不僅將視圖控制器添加到堆棧 - 它還刷新視圖以顯示該視圖控制器。在這種情況下,我們不想看到'page1ViewController',即使是短暫的,所以我們必須直接將它自己添加到堆棧中。 –