我正在编写一个基于故事板的 iPhone 应用程序并致力于状态恢复。正常执行转场时,我想让它们动画,但是当我恢复导航层次结构的几个级别时,我只希望最后一个转场动画。除了设置两组segue——一组使用普通的push segue,另一组使用自定义的非动画push segue——还有什么方法可以实现我想要做的吗?
问问题
9697 次
1 回答
14
可以独立于应用程序的 segue 或故事板直接操作视图控制器堆栈。
您可以使用此技术来恢复视图控制器的深层堆栈,并对顶部视图控制器执行/动画处理。(您可能需要为此创建一个特定的 push segue。)
例如,要恢复两个视图控制器堆栈,您可以执行以下操作。在此示例中,假设现有视图控制器上的某些操作会导致状态恢复,但您可以从 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
您可以仅通过从和操作视图控制器堆栈(并且不使用任何 segue)来恢复状态- (void)applicationWillEnterForeground:(UIApplication *)application
。
无论哪种方式都可以无缝地工作,并与您现有的故事板和转场配合使用。
于 2012-01-03T20:01:57.710 回答