选择另一个故事板?


133

是否可以从一个情节提要板切换到另一个情节提要板,或者将情节提要板嵌入到另一个情节提要板的视图控制器中?我需要放置UITabBarController在一个UINavigationController,我想,让他们好和分离。



5
好问题。拥有一个故事板对于基于团队的项目来说是一场噩梦。我们定期按“流程”将项目分为多个故事板(一个用于登录的故事板,一个用于新闻提要和相关屏幕的故事板等)。它有助于最大程度地减少合并冲突的数量,否则每次开发人员触摸情节提要时都会发生合并冲突。
Brian Sachetta 2015年

@BrianSachetta您还做什么?还有其他要分享的好技巧吗?
蜂蜜

这取决于您的团队结构。如果确实需要,可以将所有用户界面放在单独的.xib文件中。这就是情节提要存在之前的样子。这种方法有其优点和缺点。好处是,您几乎永远不会与该项目上的其他开发人员发生冲突。缺点是可能很难直观地看到应用程序的流程。
Brian Sachetta

Answers:


201

是的,但是您必须以编程方式执行此操作:

// 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];

11
我只想将分镜脚本分开放置;他们已经太混乱了。
Ry-

11
就像书中的章节一样,我认为需要多个故事板。
finneycanhelp 2012年

48
当您有多个开发人员在同一个应用程序上工作时,拥有多个情节提要板将非常有用,因为解决情节提要xml中的版本控制冲突有时会很痛苦。

14
在iOS 9和Xcode 7中,现在支持跨故事板引用。:-)
奎因·泰勒

1
查看milczi的答案,您现在可以在UI中非常轻松地执行此操作!
蒂姆(Tim)

117

从Xcode 7开始,您可以使用情节提要参考以图形方式执行此操作:

参考

将情节提要参考添加到您的情节提要。在ViewController和Storyboard Reference之间创建序列(Ctrl +拖动)

然后填写此字段。

在此处输入图片说明

其中“ Tutorial”是“ Tutorial.storyboard”文件,“ MainTutorialController”是ViewControllerSettings中的“ Storyboard ID”字段


1
很好的信息,但是问题被标记为ios5,所以这不适用。
lnafziger '16

10
@Inafziger是的,但是对于使用iOS 9的用户,此问题显示在搜索结果的顶部
Brian Ogden

从XCode 7开始可以使用此功能。看到更多信息stackoverflow.com/questions/30772145/...
西蒙皮卡

这行得通,但是我还需要保留导航栏,没有导航栏就可以显示它,是否有任何方法可以保留导航和按钮以将其移回历史记录,无论它来自哪个故事板?
吉尔·贝罗斯

这在iOS 10中对我有用。我确实注意到,每个序列需要一个故事板参考,并且无法将多个序列连接到一个参考点。
Mark Reid

10

因为UIStoryboardSegue是一个抽象类,所以您实际上不能手动进行segues。您需要对其进行子类化和实现perform,以使其能够执行任何操作。它们实际上是要在情节提要中创建的。不过,您可以手动推动视图控制器,这是一个很好的解决方案。lnafziger的答案做得很好:

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

但是要注意的一件事是,您说过要保持美观和独立。情节提要的想法是使您可以在一个地方进行所有设计工作的同时将各个部分分开。每个视图控制器都很不错,并且在情节提要板中彼此分离。整个想法是将所有内容都放在一个地方。只需将其布置得井井有条即可,以便井井有条,而且您会很方便。除非有充分的理由,否则不要分离它。


6
合并情节提要板效果不佳,因此在多开发人员环境中,使用单独的情节提要板可能会很有趣。在只有一个故事板的大型项目中,性能也会变得很差。
calimarkus 2012年

1
我们使用多个情节提要板,但重点是您不能真正做到这一点并在它们之间进行筛选。苹果公司对其进行了设计,因此您可以在一个地方进行所有操作,因此该想法只是使用一个(并非您不能这样做)。性能不应该成为问题。对于每个视图控制器,情节提要板被编译成单独的nib文件。您应该从情节提要中获得非常好的表现。就像每个视图控制器都有单独的Xib一样,性能也一样好。
wbyoung 2012年

3
就我而言,性能问题通常是在Xcode中出现的。苹果目前对情节提要编辑器的实现很薄弱。
亚当

1
在2014 Mac Pro上打开一个60场景的Storyboard需要13秒。我提起了雷达。
罗伯特·阿特金斯

7

您不应将UITabBarControllers放在UINavigationController中。它正在询问错误的信息,例如错误的自动旋转/视图卸载等,因为Apple 不支持这种限制:

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

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

1
我完全同意,原因有很多。将TabBarController放置在NavigationController中不是一个好主意,因为对于包含在其中的视图,委托将无法正确触发,并且最终用户将很难导航界面。他们很难回到从TabBar / Navigation界面导出的控制器。另一种方法是,在TabBarController中使用一个NavigationController。最好不要混淆最终用户,听听苹果的建议!
休伯特·库内迈耶

1
然而,本机iPhone音乐应用程序正是这样做的(“正在播放”部分)。
Enzo Tran 2013年

仅供参考:iPhone音乐应用程序的“正在播放”屏幕中没有TabbarController。
sanjana

4

这是一个快速版本:

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

-1

您是否尝试过以下方法:

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

注意:我没有测试它,因为我使用的是相反的方法:制作选项卡式应用程序并将导航控制器放入其中)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.