在Xcode中使用故事板引用,应该在哪里使用?

66

Xcode7 beta中有一个新控件,名为Storyboard Reference。下面是它的图片。

enter image description here

它的描述是:

为来自外部storyboard的视图控制器提供占位符。连接到此占位符的转场将在运行时实例化引用的视图控制器。

所以问题是:

  1. 在哪些情况下应该使用此功能?
  2. 此功能是否用于通过segue连接两个storyboard的视图控制器?
  3. 此方法是否用于以编程方式替换另一个storyboard的VC?
  4. 它能在旧的iOS版本(iOS 9之前)上工作吗?
1. 在需要将多个Storyboard组成一个大型单一界面的情况下使用它可以帮助简化故事板的管理。
2. 是的,这个控件可以用于通过segue连接两个storyboard的视图控制器。
3. 是的,您可以使用此方法以编程方式替换另一个storyboard的VC。
4. 是的,但是只有在使用UIStoryboardReferences向后兼容时才适用于旧的iOS版本(iOS 9之前)。

你的情况搞清楚了吗?还需要更多的解释吗? :) @YogeshSuthar - nburk
1
@nburk 是的,我弄清楚了,而且我找到了如何使用它。我也把它发布为答案了。 :) - Yogesh Suthar
7个回答

51

更新(2016年1月6日):我想快速提及一下,使用Storyboard引用非常简单,可以帮助您更清洁和可维护地使用Storyboard。一个很好的用例是拥有多个标签的UITabBarController。只需为每个标签创建一个Storyboard,在您的Main.Storyboard中使用Storyboard引用链接到这些单独的Storyboards。使用非常简单:在创建Storyboard引用之后,您只需要给它要链接的单独Storyboards的文件名并设置该单独Storyboard中的初始视图控制器即可。就是这样!:)

现在跟着 @YogeshSuthar 的问题所述:

  1. 这可以用于您的应用程序中使用多个故事板的情况。直到现在,您必须以编程方式从其他故事板实例化视图控制器,看起来现在您可以只是使用此引用,并像使用来自同一故事板的视图控制器一样在故事板中创建segue。

  2. 是的,您可以将当前故事板中的一个视图控制器与另一个来自不同故事板的视图控制器连接,并在这两者之间创建segue。

  3. 是的,这可以用来替换以前用于以编程方式从其他故事板实例化视图控制器的代码。

  4. [感谢 @AlexBasson 的更新]Storyboard引用可以部署到iOS 8OS X 10.10watchOS 1


2
替换意味着我们不必编写代码从不同的故事板中打开VC。你的答案已经令人满意,但我仍在等待更详细的答案。+1 - Yogesh Suthar
18
根据Xcode 7 Beta 4版本说明,“Storyboard引用可以部署到iOS 8、OS X 10.10和watchOS 1。” (http://adcdownload.apple.com/Developer_Tools/Xcode_7_beta_4/Xcode_7_beta_4_Release_Notes.pdf) - Alex Basson
谢谢你的提示,我会更新答案!@AlexBasson - nburk
6
值得注意的是,在iOS8中,Storyboard参考不能作为关系转场,例如从标签栏到视图控制器。 - Kubba
一个人如何使用取消转场? - Ryan Romanchuk

39

使用故事板引用

其他答案对我的问题都是正确的。

我想发布使用 Storyboard Reference 的方法,该方法可通过segue从另一个故事板打开视图控制器而无需编写任何代码。 :)

步骤

  1. 首先创建一个新的故事板,将其命名为任何您想要的名称(我命名为NewStoryboard)。
  2. 将您的视图控制器(或任何视图控制器)放置在NewStoryboard中。
  3. 给它一个Storyboard ID(我已经给出了newVC)。

enter image description here

  1. 切换回主故事板。
  2. 在此故事板中拖放Storyboard Reference控件。
  3. 选择Storyboard Reference控件并选择Attributes Inspector
  4. 选择您的新故事板NewStoryboard
  5. 提供引用ID作为newVC(您在NewStoryboard故事板中使用的ID)。
  6. 通过segue将此Storyboard Reference连接到ViewController。现在它将通过segue打开此VC而无需编写代码。 :)

enter image description here


1
你就像托尼·斯塔克一样拯救了我的世界。请提供Xcode 10的确切步骤。 - Damitha Raveendra

9

13
从Xcode 7 Beta 4开始,这一情况已经发生改变。根据发布说明,“故事板引用可部署到iOS 8、OS X 10.10和watchOS 1。”(http://adcdownload.apple.com/Developer_Tools/Xcode_7_beta_4/Xcode_7_beta_4_Release_Notes.pdf) - Alex Basson
3
你可以使用xCode7或更高版本。现在可以将Storyboard References部署到iOS 8、OS X 10.10和watchOS1上。然而,向后部署的Storyboard References可能无法连接到关系segue,并且不能引用外部包中的Storyboard。(21275172)https://developer.apple.com/library/tvos/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc7_release_notes.html - Krishna Kishore

6
以下是翻译的结果:
  1. 它能在旧版iOS(iOS 9之前)上运行吗?

这里有一个解决方法(已由Xcode 8和iOS 8.2验证):

  1. 在选项卡的视图控制器中添加一个容器视图,使其框架占据整个视图(如果需要,添加约束)。
  2. 删除容器视图自动添加的嵌入式视图控制器。
  3. 创建你的Storyboard引用,并将嵌入式segue从容器视图拖到该引用。
  4. 如果还没有,请创建Storyboard并将Storyboard引用分配给它。
  5. 在新的Storyboard中,您可以通过选择第一个视图控制器并在属性检查器下的模拟指标 -> 底部栏中选择要显示的选项卡栏(例如半透明)来模拟选项卡的外观。

屏幕截图


这对大多数目的来说还不错,但我发现一个缺点是似乎无法在嵌入的Storyboard中隐藏选项卡栏。 - yesthisisjoe
@yesthisisjoe 通过重写 - (void)didMoveToParentViewController:(UIViewController *)parent 方法获取包含容器视图的视图控制器的引用,然后通过 parent.tabBarController.tabBar.hidden = YES; 隐藏它。参见 https://dev59.com/EWEi5IYBdhLWcg3wd8Ku#21282880 - Nianliang
没错。我想我的问题在于选项卡栏没有任何动画就隐藏了,而不是像启用hidesBottomBarWhenPushed时推送状态栏时移出屏幕。 - yesthisisjoe
如何通过故事板引用传递数据? - Bhavin Bhadani

3

我在使用iOS 8和Xcode 7测试“故事板引用”时失败了。

Illegal Configuration: Storyboard References cannot be the destinations of 
relationship segues prior to iOS 9.0

8
这一点在Xcode 7.0的变更日志中有特别提到。向后兼容的关系segue(即与iOS 8兼容)不能是关系segue(即标签栏控制器中的视图控制器)。普通segue(显示/呈现segue等)在iOS 8上使用故事板引用时按预期工作。 - Dominik Hadl
5
这个功能完全没有用,因为UITabBarController的所有转换都是关系。 - Cristi Băluță
实际上,这是相当无用的。我认为编译器很容易注入代码,使其在iOS8上运行。 - Legoless
@CristiBăluță 一个解决方法是在通用视图控制器中使用容器视图(嵌入segue)包装目标。请查看我的答案以获取更多信息。 - Nianliang
我想现在没有人再支持iOS7了,所以不应该是个问题,但我认为也不应该使用这个功能,也不要使用segues。谁知道他们将来会有什么绝妙的想法...我相信线框图是现在的趋势,未来也不会失败。 - Cristi Băluță

3
在最新的中,针对Xcode版本添加了以下注释(当前版本:Xcode 7.2.1):

现在可以将Storyboard引用部署到iOS 8、OS X 10.10和watchOS 1。

这是个好消息,但仍需注意以下事项:

iOS 9.0之前,Storyboard引用不能作为关系segue的目标。

因此,如果您注意到这两个要点,那么就可以开始使用了 :)


1
是的,我们也可以部署到iOS8。 :) - Yogesh Suthar

2
当我们拥有一个包含太多屏幕和模块的大型应用程序时,按照模块将storyboard分成多个storyboard是一个很好且方便的选择。在使用多个storyboard时,如果您需要在不同storyboard的viewControllers之间连接segue,可以使用这个控件。如果您正在使用此控件,则无需进行诸如instantiateViewController和pushViewController等编码操作。您只需连接segue,执行segue,如果需要,可以使用prepareForSegue。
让我们讨论一下您所有的问题:
1. 在哪些情况下应该使用它? - 我认为您已经在上面找到了答案。
2. 这是用来通过segue连接两个storyboard的视图控制器吗? - 是的
3. 这种方法是用来以编程方式替换另一个storyboard的视图控制器吗? - 使用此控件时与编码无关。
4. 它会在旧版本的iOS(iOS 9之前)上工作吗? - 可能会工作,我没有尝试过。

2
很好。但是,根据最新消息“故事板引用可以部署到iOS 8、OS X 10.10和watchOS 1”。它说它可以被部署。但是,我们能够在针对iOS 8的目标下进行编译吗? - Akshit Zaveri
是的,你可以将其编译为iOS8目标。 我这样做了,并且我正在使用xCode7.1。 - Krishna Kishore
请注意:在iOS 9.0之前,_Storyboard References不能作为关系segue的目标。所有其他segue对于iOS 8都可以正常工作。 - TheCommonEngineer
你不会实例化vc并将其推送,但你会做一些更复杂的事情,即实现令人困惑的prepareForSegue。 - Cristi Băluță

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接