故事板导航 - 从堆栈中推送和删除

时间:2014-05-25 20:44:59

标签: ios storyboard

我在同一个ios应用程序中有两个故事板。

Storyboard 1是login.storyboard。 Storybaord 2是processing.storyboard。

login.storyboard有以下场景:

1)欢迎

2)登录

processing.storyboard有

1)开始

2)图片

3)描述

4)完成

login.storyboard处理登录,而processing.storyboard创建和对象上传。

我对堆栈的理解如下:

从欢迎导航到登录提供:

1:[welcome]-[login.storyboard]

2:[login]-[login.storyboard]
登录后

我使用

推送处理.storyboard
- (void) pushStory: (NSString *) story {

UIStoryboard *settingsStoryboard = [UIStoryboard storyboardWithName:story bundle:nil];
UIViewController *initialSettingsVC = [settingsStoryboard instantiateInitialViewController];
initialSettingsVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:initialSettingsVC animated:YES completion:nil];
}
堆栈现在应该是:

1:[welcome]
2:[login]
3:[start]

在决定点击退出(每页可用)之前,我可能会在工作流程中进行描述,此时我的堆栈将是

1:[welcome]-[login.storyboard]

2:[login]-[login.storyboard]

3:[start]-[processing.storyboard]

4:[images]-[processing.storyboard]

5:[description]-[processing.storyboard]

注销应该带我回到[欢迎],我的问题是故事板如何将堆栈清除回[welcome]并确保login.storyboard是最新的。

我的知识存在差距,因为我已经在6年左右的时间内重新回到了iphone开发中而且之前没有见过这些。

我曾想过将login.storyboard推入堆栈,但这只会让堆栈继续增长而不是清除它

2 个答案:

答案 0 :(得分:1)

您可以pop回到堆栈中的任意点,例如

    [self.navigationController popToRootViewControllerAnimated:YES];         // all the way back to the first view controller
    [self.navigationController popToViewController:self.navigationController.viewControllers[1] animated:YES];  // back to the second view controller 
    [self.navigationController popViewControllerAnimated:YES];               // back to the previous view controller

这个答案假定故事板1有

  • 导航控制器
  • 欢迎视图控制器
  • 登录视图控制器

和故事板2有

  • 导航控制器
  • 启动视图控制器
  • 图像视图控制器
  • description view controller
  • 完成视图控制器

请注意,故事板2中的导航控制器从未实际实例化,但需要这样才能使故事板2中的其他视图控制器通过segue连接。从login view controller导航到start view controller代码时,代码应与此类似

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ControllerC"];
[self.navigationController pushViewController:vc animated:YES];

请注意,这不会实例化initialViewController,因为那是导航控制器,我们不需要其他导航控制器。相反,在start下为Storyboard ID视图控制器Identity inspector,然后直接实例化start视图控制器。实例化start视图控制器后,将其推送到现有导航控制器。如果您不希望用户导航回login视图控制器,则可能需要隐藏后退按钮。

答案 1 :(得分:1)

使用展开segues。

在[welcome]中添加此方法:

-(IBAction)reset:(UIStoryboardSegue *)segue
{
    NSLog(@"Back to Welcome");
}

在Interface Builder中,在[start],[images]和[description]中创建UIButtons,然后将这些按钮中的每一个链接到绿色"退出"各自viewControllers的按钮,然后在出现的弹出菜单中选择reset:

(参见WWDC 2012会话视频"在您的应用中采用故事板"有关展开segues的更多详细信息[从38分钟开始]。)