13

ストーリーボード ベースの iPhone アプリを作成し、状態の復元に取り組んでいます。セグエを普通に実行するときはアニメーションさせたいのですが、ナビゲーション階層のいくつかのレベルを復元するときは、最後のセグエだけをアニメーションさせたいです。2 セットのセグエ (通常のプッシュ セグエを使用するセットと、カスタムの非アニメーション プッシュ セグエを使用するセット) を設定する以外に、私がやろうとしていることを達成する方法はありますか?

4

1 に答える 1

14

アプリケーションのセグエやストーリーボードとは無関係に、View Controller スタックを直接操作することができます。

この手法を使用して、View Controller の深いスタックを復元し、最上位の View Controller へのセグエを 1 つだけ実行またはアニメーション化できます。(おそらく、この目的のために特定のプッシュ セグエを作成する必要があります。)

たとえば、2 つのビュー コントローラー スタックを復元するには、次のようにします。この例では、既存のビュー コントローラーに対する何らかのアクションが状態の復元につながると想定していますが、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

どちらの方法でも、既存の絵コンテやセグエとシームレスに連携して機能します。

于 2012-01-03T20:01:57.710 に答える