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

phi*_*pfc 2 uiviewcontroller ios uistoryboard uistoryboardsegue xcode4.5

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

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

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

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

Rob*_*Rob 5

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

  1. 以最大的向后兼容性最简单的办法与旧版本的iOS的是使用导航控制器,保持对它的引用视图控制器B的地方,然后就可以在E,有一些IBAction,做:

    [self.navigationController popToViewController:B animated:YES];
    
    Run Code Online (Sandbox Code Playgroud)

    在该模型中,所有的塞格斯的将在故事板来表示,除了一个从EB,用于您将使用上面的代码中的IBAction(或其他).

  2. 如果您可以放弃iOS 5兼容性,您也可以使用unwindsegue.在这种情况下,所有segue都将在故事板中表示.但是我们中的许多人还不愿意放弃iOS 5的兼容性,所以也许你不想考虑这个解决方案.但是如果你确实想要使用unwind 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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    一旦你有这个展开动作B,你会突然有一个新的segue类型叫backToB(虽然,我建议你给它一个比这更好的名字)在IB中呈现给你,你可以使用它来E进行B.显然,所有其他推送segues将像往常一样在你的故事板中表示.

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

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

    BABCDE

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

    [self presentViewController:A animated:NO];
    
    Run Code Online (Sandbox Code Playgroud)

    虽然B是根视图控制器,但感觉就像A是.当A完成后,将解散回B,在这一点上,你可以做你的标准B- C- D- E推SEGUE进展,而是因为我们做了B根控制器,E可以做popToRootViewControllerAnimated要回B,而你并不需要关于保持了愁指向B周围.如果A是登录控制器或启动画面,或者某种程度上不符合正常流程,这个模型很有意义.

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