我想在 xcode 故事板中链接视图控制器以实现以下效果:
A -> B -> C -> D -> E -> B -> C -> D -> E -> B -> ...
其中上述字母代表单独的视图控制器(全尺寸场景)。我希望在视图之间进行从右到左的水平滑动转场,并且我不希望或不需要保留先前视图的状态(即没有推送或模态转场)。我确实需要在视图之间转移一些状态。
关于如何使用故事板编辑器、代码或两者的某种组合来最好地实现这一目标的任何建议?
我想在 xcode 故事板中链接视图控制器以实现以下效果:
A -> B -> C -> D -> E -> B -> C -> D -> E -> B -> ...
其中上述字母代表单独的视图控制器(全尺寸场景)。我希望在视图之间进行从右到左的水平滑动转场,并且我不希望或不需要保留先前视图的状态(即没有推送或模态转场)。我确实需要在视图之间转移一些状态。
关于如何使用故事板编辑器、代码或两者的某种组合来最好地实现这一目标的任何建议?
我有几个选择:
与旧版本的 iOS 具有最大向后兼容性的最简单的解决方案是使用导航控制器,在B
某处保留对视图控制器的引用,然后您可以在 处E
进行一些IBAction
操作:
[self.navigationController popToViewController:B animated:YES];
在这个模型中,所有的 segues 都将在故事板中表示,除了 from E
to B
,您可以在 an IBAction
(或其他)中使用上面的代码。
如果你可以抛弃 iOS 5 的兼容性,你也可以使用unwind
segue。在这种情况下,所有的转场都将在故事板中表示。但是我们中的许多人还不愿意放弃 iOS 5 的兼容性,所以也许你不想考虑这个解决方案。但是,如果您确实想使用展开转场,您只需在 中定义一个展开动作B
,例如:
- (IBAction)backToB:(UIStoryboardSegue *)segue
{
// if you need to do any UI update because we got an unwind segue
// back to this controller, do that here
}
一旦你在 IB 中有这个 unwind 动作B
,你会突然backToB
在 IB 中看到一个新的 segue 类型(不过,我建议你给它一个更好的名字),你可以使用它来从E
到B
。显然,所有其他的 push segues 都会像往常一样出现在你的故事板中。
如果您真的不想使用导航控制器,但又不需要 iOS 4 兼容性,您也可以使用视图控制器包含来实现这一点,其中您有一个父自定义容器控制器ParentVC
,并且A
通过E
将是子控制器。然后,您可以使用自定义 segues 在子控制器序列中进行转换。
最后一种变体可能如下:
在这种情况下,就像选项 1 一样,您只是使用导航控制器,当B
第一次加载时,它将以编程方式立即执行以下操作viewDidLoad
[self presentViewController:A animated:NO];
虽然B
是根视图控制器,但感觉就像A
是。完成A
后它会解散回B
,此时您可以执行您的标准B
- C
-推动 segue 进程,但是因为我们制作D
了根控制器,所以可以返回到,并且您无需担心保持指向周围的指针。如果是登录控制器或启动屏幕,或者有些超出正常流程的东西,这个模型很有意义。E
B
E
popToRootViewControllerAnimated
B
B
A
其中,1 可能是最简单的,2 可能被认为是最优雅的(尽管您失去了 iOS 5 和更早的支持),如果您不介意编写更多(某些复杂的)代码并且内存使用至关重要,则可以选择 3 , 和 4 和 1 一样,非常简单,但这只是流程是否对您的应用有意义的问题。就个人而言,我倾向于选项 1 或 4,这取决于视图控制器A
是什么。如果需要 iOS 4 兼容性,这两个选项也适用于 NIB。