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