【问题标题】:Segue to another storyboard?转到另一个故事板?
【发布时间】:2012-03-23 11:01:28
【问题描述】:

是否可以从一个情节提要转移到另一个情节提要,或者将情节提要嵌入到另一个情节提要的视图控制器中?我需要将UITabBarController 放在UINavigationController 中,并且我想让它们保持良好和独立。

【问题讨论】:

  • 好问题。拥有一个故事板对于基于团队的项目来说是一场噩梦。我们定期按“流程”将项目分解为故事板(一个用于登录的故事板,一个用于新闻提要和相关屏幕的故事板等)。它有助于最大限度地减少合并冲突的数量,否则每次开发人员触摸情节提要时都会发生合并冲突。
  • @BrianSachetta 你还做什么?还有其他类似的好技巧可以分享吗?
  • 这取决于您的团队结构。如果您真的想要,您可以将所有用户界面放在单独的 .xib 文件中。这就是故事板存在之前的样子。这种方法有利有弊。好处是您几乎不会与项目中的其他开发人员发生冲突。缺点是很难直观地看到应用流程。

标签: ios xcode cocoa-touch ios5 uistoryboard


【解决方案1】:

是的,但您必须以编程方式进行:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

【讨论】:

  • 我真的很想把故事板分​​开;它们已经太杂乱了。
  • 就像书中的章节一样,我认为需要多个故事板。
  • 当您有多个开发人员在同一个应用程序上工作时,拥有多个情节提要非常有用,因为解决情节提要 xml 中的版本控制冲突有时非常痛苦。
  • 在 iOS 9 和 Xcode 7 中,现在支持跨故事板引用。 :-)
  • 查看 milczi 的回答,您现在可以在 UI 中轻松完成此操作!
【解决方案2】:

从 Xcode 7 开始,您可以使用 Storyboard Reference 以图形方式执行此操作:

将故事板引用添加到您的故事板。在 ViewController 和 Storyboard Reference 之间创建 segue(ctrl + 拖动)

然后填写此字段。

其中“Tutorial”是“Tutorial.storyboard”文件 并且“MainTutorialController”是您在 ViewControllerSettings 中的“故事板 ID”字段

【讨论】:

  • 很好的信息,但是问题被标记为 ios5,所以这不适用。
  • @Inafziger 是的,但这个问题出现在使用 iOS 9 的人的搜索结果顶部
  • 从 XCode 7 开始提供。查看更多信息stackoverflow.com/questions/30772145/…
  • 这行得通,但我还需要保留导航栏,它在没有导航栏的情况下显示,有没有办法保留导航和按钮以将其移回历史记录,没关系它来自什么故事板?
  • 这在 iOS 10 中对我有用。我确实注意到每个 segue 需要一个情节提要参考,并且无法将多个 segue 连接到一个参考点。
【解决方案3】:

您不能真正手动进行转场,因为 UIStoryboardSegue 是一个抽象类。您需要对其进行子类化并实现perform 以便它执行任何操作。它们真的应该在故事板中创建。不过,您可以手动推送视图控制器,这是一个很好的解决方案。 lnafziger 的回答做得很好:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

不过,需要注意的一点是,您曾说过您希望让事物保持良好和独立。故事板的想法是让您在一个地方完成所有设计工作时将事物分开。每个视图控制器都很好,并且在情节提要中与其他控制器分开。整个想法是将所有内容保存在一个地方。只需将其布置好,使其井井有条,您就可以开始了。除非您有充分的理由,否则不应将其分开。

【讨论】:

  • 合并故事板效果不佳,因此在多开发人员环境中,使用单独的故事板可能会很有趣。此外,在具有单个故事板的大型项目中,性能可能会变得很差。
  • 我们使用多个故事板,但关键是您不能真正做到这一点并在它们之间进行切换。 Apple 设计它是为了让你可以在一个地方做所有事情,所以这个想法有点像只使用一个(不是你不能)。性能应该不是问题。故事板为每个视图控制器编译成单独的 nib 文件。您应该从情节提要中获得非常好的表现。性能将与每个视图控制器都有单独的 xib 一样好。
  • 就我而言,性能问题通常出现在 Xcode 中……Apple 目前的情节提要编辑器实现很弱。
  • 在 2014 Mac Pro 上打开 60 场景故事板需要 13 秒。我已经提交了雷达。
【解决方案4】:

您不应该将 UITabBarControllers 放在 UINavigationController 中。它要求诸如不正确的自动旋转/视图卸载等错误,如 Apple doesn't support 这种遏制:

然而,当组合视图控制器时,包含的顺序很重要;只有某些安排是有效的。从子到父的收容顺序如下:

  • 内容视图控制器和具有灵活边界的容器视图控制器(例如页面视图控制器)
  • 导航视图控制器
  • 标签栏控制器
  • 拆分视图控制器

【讨论】:

  • 我完全同意,原因有很多。将 TabBarController 放在 NavigationController 中并不是一个好主意,因为委托无法正确触发其中包含的视图,并且最终用户将在导航界面时遇到麻烦。他们将很难回到从 TabBar/Navigation 界面引出的控制器。反过来,也可以,TabBarController 中的 NavigationController。最好不要混淆最终用户并听取 Apple 的建议!
  • 而原生 iPhone 音乐应用正是这样做的(“正在播放”部分)。
  • 仅供参考:iPhone 音乐应用在“正在播放”屏幕中没有 TabbarController。
【解决方案5】:

这是一个快速版本:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}

【讨论】:

  • 这不是segue
【解决方案6】:

您是否尝试过以下方法:

2/ 单击以选择链接到导航控制器并在顶部菜单中的视图控制器:编辑器 -> 嵌入 -> 选项卡栏控制器

注意:我没有测试它,因为我使用的是相反的:制作标签栏应用程序并将导航控制器放入其中。

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2017-05-14
    • 2017-02-22
    • 2017-01-04
    • 2013-02-03
    • 2012-12-03
    相关资源
    最近更新 更多