2011-12-05 4 views
13

저는 스토리 보드 기반 iPhone 응용 프로그램을 작성 중이며 상태 복원 작업을하고 있습니다. 일반적으로 segues를 수행 할 때 애니메이션을 적용하고 싶지만 탐색 계층 구조를 여러 수준으로 복원 할 때 마지막 segue 만 애니메이션으로 만들면됩니다. 두 세트의 segues를 설정하는 것 외에도 일반적인 push segue를 사용하는 세트와 애니메이션이 아닌 push custom segue를 사용하는 세트는 내가하려는 것을 달성 할 수있는 방법이 있습니까?애니메이션없이 밀어 넣기

답변

14

응용 프로그램의 섹 또는 스토리 보드와 독립적으로보기 컨트롤러 스택을 직접 조작 할 수 있습니다.

이 기법을 사용하면 뷰 컨트롤러의 깊은 스택을 복원하고 상위 뷰 컨트롤러에 단일 섹터 만 수행/애니메이션 할 수 있습니다. 예를 들어, 두 개의보기 컨트롤러 스택을 복원하려면 다음을 수행 할 수 있습니다 (이 용도로 특정 밀어 넣기 단락을 작성해야 할 가능성이 높습니다.)

예를 들어 두 개의보기 컨트롤러 스택을 복원하려면 다음을 수행 할 수 있습니다. 이 예제에서는 기존보기 컨트롤러의 일부 동작이 상태 복원으로 연결되지만 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

흥미 롭다.'pushContController : animated :'를 사용하지 않고'viewControllers' 배열을 조작하는 이유가 있을까요? –

+4

'pushViewController : animated :'는 스택에 뷰 컨트롤러를 추가 할뿐만 아니라 뷰 컨트롤러를 보여주기 위해 뷰를 새로 고칩니다. 이 경우 우리는 간단히'page1ViewController'를보고 싶지 않으므로 직접 스택에 추가해야합니다. –