【问题标题】:How should I chain viewcontrollers in xcode storyboard?我应该如何在 xcode 故事板中链接视图控制器?
【发布时间】:2013-01-06 02:44:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios uiviewcontroller xcode4.5 uistoryboard uistoryboardsegue


    【解决方案1】:

    我突然想到了几个选项:

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

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

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

    2. 如果您可以放弃 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
      }
      

      一旦您在B 中进行了此放松操作,您将突然在 IB 中向您展示一个名为 backToB 的新 segue 类型(不过,我建议您给它一个更好的名称),并且您可以使用它从E 转到B。显然,所有其他的 push segues 都会像往常一样出现在你的故事板中。

    3. 1234563 , 和 AE 将是子控制器。然后,您可以使用自定义 segues 在子控制器序列中进行转换。
    4. 最后一个变体可能如下:

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

      [self presentViewController:A animated:NO];
      

      虽然B 是根视图控制器,但感觉就像A 是。当A 完成后,它会解散回B,此时您可以执行您的标准B-C-D-E 推动segue 进程,但是因为我们使B根控制器,E 只需执行popToRootViewControllerAnimated 即可返回B,您无需担心保留指向B 的指针。如果A 是一个登录控制器或启动屏幕,或者有些不正常的流程,这个模型就很有意义。

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

    【讨论】:

    • 选项 4 看起来不错,除了顶部的导航。使用属性或代码是否有一种简单的方法来隐藏导航控制器在每个后续视图顶部引入的导航?
    • @philipfc 在代码中:[self.navigationController setNavigationBarHidden:YES animated:NO]; 在 B 的 viewDidLoad 中。您可能还想转到情节提要,单击导航控制器,转到“属性检查器”(最右侧面板上的第四个选项卡),转到“模拟指标”,然后关闭“顶部栏”。这不会取代 setNavigationBarHidden 代码,但如果您知道场景的实际外观,它只会让您更容易设计场景。如果您在导航控制器本身上执行此操作,该模拟指标将在所有场景中传播。
    • 这很好地结合在一起。我在测试时所做的唯一更改是取消选中导航控制器属性检查器中的“显示导航栏”,这似乎消除了在代码中隐藏导航栏的需要。
    • @philipfc 我不知道这个选项,但它非常有意义。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多