アニメーションなしでセグエを押してください
-
28-10-2019 - |
質問
私はストーリーボードベースのiPhoneアプリを書いており、状態の修復に取り組んでいます。通常、セグを実行するときは、アニメーション化したいのですが、ナビゲーション階層のいくつかのレベルを復元しているときは、最後のセグエにアニメーション化するだけです。セーグの2セットをセットアップする以外に、通常のプッシュセグエを使用するセットと、カスタムの非アニメーションプッシュセグエを使用する別のセットは、私がやろうとしていることを達成する方法はありますか?
解決
アプリケーションのセグラードまたはストーリーボードとは無関係に、ビューコントローラースタックを直接操作することができます。
この手法を使用して、ビューコントローラーの深いスタックを復元し、トップビューコントローラーに1つのセグエを実行 /アニメーション化できます。 (この目的のために特定のプッシュセグエを作成する必要があるでしょう。)
たとえば、2つのビューコントローラースタックを復元するには、以下を実行できます。この例では、既存のビューコントローラーに対する何らかのアクションが状態の復元につながると想定されていますが、アプリデリゲートから簡単に実行できます。
[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
.
いずれにせよ、既存のストーリーボードやセグラとシームレスに、そして連携して動作します。