2

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

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

其中上述字母代表单独的视图控制器(全尺寸场景)。我希望在视图之间进行从右到左的水平滑动转场,并且我不希望或不需要保留先前视图的状态(即没有推送或模态转场)。我确实需要在视图之间转移一些状态。

关于如何使用故事板编辑器、代码或两者的某种组合来最好地实现这一目标的任何建议?

4

1 回答 1

5

我有几个选择:

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

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

    在这个模型中,所有的 segues 都将在故事板中表示,除了 from Eto B,您可以在 an IBAction(或其他)中使用上面的代码。

  2. 如果你可以抛弃 iOS 5 的兼容性,你也可以使用unwindsegue。在这种情况下,所有的转场都将在故事板中表示。但是我们中的许多人还不愿意放弃 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 类型(不过,我建议你给它一个更好的名字),你可以使用它来从EB。显然,所有其他的 push segues 都会像往常一样出现在你的故事板中。

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

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

    BABCDE

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

    [self presentViewController:A animated:NO];
    

    虽然B是根视图控制器,但感觉就像A是。完成A后它会解散回B,此时您可以执行您的标准B- C-推动 segue 进程,但是因为我们制作D了根控制器,所以可以返回到,并且您无需担心保持指向周围的指针。如果是登录控制器或启动屏幕,或者有些超出正常流程的东西,这个模型很有意义。EBEpopToRootViewControllerAnimatedBBA

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

于 2013-01-22T19:11:32.367 回答