我应该如何在xcode storyboard中链接viewcontrollers?

时间:2013-01-22 18:50:36

标签: ios uiviewcontroller xcode4.5 uistoryboard uistoryboardsegue

我想在xcode故事板中链接视图控制器以实现以下效果:

A - > B - > C - > D - > E - > B - > C - > D - > E - > B - > ...

其中上述字母代表单独的视图控制器(全尺寸场景)。当我在视图之间进行时,我希望从右到左有一个水平滑动segue,我不希望或需要保留先前视图的状态(即没有push或modal segue)。我确实需要在视图之间传输一些状态。

有关如何使用故事板编辑器,代码或两者的某种组合来最好地实现此目的的任何建议吗?

1 个答案:

答案 0 :(得分:5)

有几个选择让我跳了出来:

  1. 与旧版iOS具有最大向后兼容性的最简单解决方案是使用导航控制器,在某处保留对控制器B的引用,然后您可以在E处,有一些IBAction可以:

    [self.navigationController popToViewController:B animated:YES];
    

    在此模型中,除EB之外的所有segue都会在故事板中表示,您可以在IBAction中使用上述代码(或其他)。

  2. 如果你可以放弃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。显然,所有其他推送段将像往常一样在故事板中表示。

  3. 如果你真的不想使用导航控制器,但不需要iOS 4兼容性,你也可以通过视图控制器包含实现这一点,你有一个父自定义容器控制器,{{1 }和ParentVCA将成为子控制器。然后,您可以使用自定义segue来转换子控制器序列。

  4. 最后一个变体可能如下:

    BABCDE

    在这种情况下,与选项1一样,您只是使用导航控制器,首次加载E时,它会以编程方式立即执行B

    中的以下操作
    viewDidLoad

    虽然[self presentViewController:A animated:NO]; 是根视图控制器,但感觉就像B一样。完成A后,它会退回A,此时您可以执行标准B - B - C - D推送segue进展,但因为我们将E作为根控制器,B可以E返回popToRootViewControllerAnimated,您无需担心保留指向B周围的指针。如果B是登录控制器或启动画面,或者某种程度上超出正常流程,则此模型很有意义。

  5. 其中,1可能是最简单的,2可能被认为是最优雅的(虽然你失去了iOS 5和更早的支持),如果你不介意写一些(有些复杂的)代码和内存,3是一个选项使用是至关重要的,4,就像1一样,非常简单,但这只是流程是否对您的应用程序有意义的问题。就个人而言,我倾向于选项1或4,具体取决于控制器A的视图。如果需要iOS 4兼容性,这两个选项也适用于NIB。