故事板 - 如何在没有动画和显示屏幕的情况下自动执行转场
Posted
技术标签:
【中文标题】故事板 - 如何在没有动画和显示屏幕的情况下自动执行转场【英文标题】:Storyboards - how to perform segues automatically without animation and showing the screen 【发布时间】:2014-05-07 17:33:46 【问题描述】:我有一个应用程序,用户必须在初始屏幕上输入一些信息,例如登录凭据。所有的导航都是使用故事板和 segues 完成的,它会自动将导航栏设置在顶部。
我有两个故事板共享相同的控制器,所以我对 segue 使用相同的名称(ipad 和 iphone 版本)。
所以当用户回到应用程序时,我读取了核心数据并知道他已经执行了初始步骤,所以我想“跳过”那些屏幕。
问题: 我只能在视图可见后执行 segues,否则导航会搞砸。但是这样做时,用户会短暂地看到屏幕并看到动画“推”开该屏幕。我想在导航栏上保留导航历史,这就是为什么我想使用 segues 以及与之相关的所有逻辑。
所有解决方案都指向以编程方式创建视图并将它们放入堆栈,但我想利用情节提要。
【问题讨论】:
尝试使用 performSegueWithIdentifier 根据身份验证状态指定要“链接”到的 segue。至于搞砸的导航,我不确定如果您正确设置了故事板,我会理解为什么会这样 我们已经在做 performSegueWithIdentifier,问题是它只能在 viewDidAppear 事件上执行,而不像 viewDidLoad 一样早。这意味着用户已经在查看屏幕并且会注意到转换。如果您尝试在 viewDidLoad 上执行此操作,则导航会出错(如果您检查控制台,则会出现一些警告)。 我不确定我是否理解为什么只能在视图中执行 segue 确实出现了。假设您有一个登录控制器,您执行登录,然后执行所需的转场。这将作为身份验证的一部分发生,而不是视图加载。我想我对你写的“所以当用户回到应用程序”的行感到困惑,你能解释更多或显示代码吗? 好的,让我试着简化一下这个问题。我有两个屏幕,当用户按下按钮时,他会从第一个屏幕导航到第二个屏幕。执行 performSegueWithIdentifier,第二个屏幕出现从右侧滑入(推)。在某些情况下,我想跳过第一个屏幕并直接进入第二个屏幕,但如果用户愿意,他可以按返回按钮并返回第一个屏幕。所以我正在做的是 viewDidAppear 上的 performSegueWithIdentifier。这会导致导航发生,但屏幕转换是可见的。 如果我尝试在 viewDidLoad 上执行此操作,这将是完美的时机,它仍然可以导航,但第二个屏幕上的“后退”按钮无法正常工作,因为我之前已经导航过。 【参考方案1】:这是一种方法;
在您的 StoryBoard 中,为第二个视图控制器分配一个标识符(这是在身份检查器上完成的,设置 Storyboard ID 字段)。在下面的代码中,我命名了我的 secondVC;
然后在你的第一个控制器的 viewDidLoad 中(你想跳过但返回的那个)做这样的事情;
- (void)viewDidLoad
[super viewDidLoad];
/// validate viewController one being displayed
if(dontDisplayFirstController)
UIStoryboard *storyBoard = self.storyboard;
UIViewController *targetViewController = [storyBoard instantiateViewControllerWithIdentifier:@"secondVC"];
UINavigationController *navController = self.navigationController;
if (navController)
[navController pushViewController:targetViewController animated:NO];
这将有效地推送到第二个视图控制器,同时仍然在导航树中保持视图控制器一个。
【讨论】:
我和 OP 有同样的问题;除了构建正确的导航堆栈之外,我还想在最顶层的视图控制器上实际执行 prepareForSegue: 方法(它设置了推送的 VC 所需的一些属性。)我知道在实例化新的 VC 后我可以“手动”执行此操作,但我想避免重复原始 prepareForSegue 的逻辑。以上是关于故事板 - 如何在没有动画和显示屏幕的情况下自动执行转场的主要内容,如果未能解决你的问题,请参考以下文章