78

我的目标是创建一个选项卡式应用程序,然后每个选项卡的视图都在单独的故事板中构建。

故事板截图

我的 mainstoryboard 是一个选项卡视图。

然后我创建了一个带有 2 个视图控制器的二级故事板 (storyboard#2)。第一个视图控制器(也被标记为初始)有一个按钮,并且(模态)到第二个视图。第一个视图控制器

我设法通过从 storyboard#2 继承和覆盖 loadView 来加载视图。 loadView 覆盖

这是模拟器输出。

模拟器

当点击“点击我”按钮时,我得到一个EXC_BAD_ACCESS. segue 不起作用,似乎第二个故事板没有完全加载。

有没有人尝试过这样做并让它工作?SkillMaster.net 上有一个 youtube 视频,但他没有演示 segue 是否在辅助情节提要下工作。视频在这里:http: //youtu.be/D4_twoYvB4M

感谢您的任何意见和帮助!

截图:

4

9 回答 9

82

这些是我在多个故事板上看到的最好的文章。

这个人不仅告诉你如何用代码创建一个新的故事板,他

  • 在实践中推荐多个故事板(更模块化的代码)
  • 讨论何时使用 xibs 与 storyboards(xibs 持有视图,storboards 基于控制器)
  • 在 github 上提供了一个链接故事板和 segues 的类

请注意,最后一点很重要,因为多个故事板的主要缺点是您通常不能将它们与 segues 链接,但 rob 库允许使用一些捏造的东西

另请参阅此处讨论的

于 2012-10-01T19:19:46.123 回答
44

OP编辑了他的问题以包括答案:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"HelpStoryboard" bundle:nil];
UIViewController* initialHelpView = [storyboard instantiateInitialViewController];

initialHelpView.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:initialHelpView animated:YES];

当然,你从哪里调用它是有意义的,因为你可能有 2 个故事板和它们在内存中的视图堆栈。因此,如果您从其他情节提要的视图控制器之外调用此代码,那可能是最好的。

于 2011-12-15T07:25:48.547 回答
19

I've examined the RBStoryboardLink approach suggested by Rhubarb. This implementation substitutes view controller's properties which looks odd. I believe I've found the way to avoid this. Here is the demo project.

Navigation controllers

Navigation controllers could just set a referenced view controller as a root. Implementation of such view controller may look like this:

@interface ExternNavigationController : UINavigationController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternNavigationController

- (void)awakeFromNib
{
    NSAssert(self.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:self.storyboardName bundle:nil];
    UIViewController *vc = self.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:self.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    self.viewControllers = @[vc];
}

@end

View controllers

Problems begin when you want to push a view controller defined in an external storyboard. This is the case when properties are copied. Instead of this, we can implement a custom segue which will substitute a fake destination controller with a real one from external storyboard.

@interface ExternStoryboardSegue : UIStoryboardSegue

@end

@implementation ExternStoryboardSegue

- (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(ExternViewController *)destination
{
    NSAssert(destination.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:destination.storyboardName bundle:nil];
    UIViewController *vc = destination.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:destination.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    return [super initWithIdentifier:identifier source:source destination:vc];
}

- (void)perform
{
    [[self.sourceViewController navigationController] pushViewController:self.destinationViewController animated:YES];
}

@end

ExternViewController is used as a placeholder and contains required for substitution properties (storyboardName and sceneIdentifier).

@interface ExternViewController : UIViewController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternViewController

@end

We need to set these properties and custom class for placeholder view controller. And also link view controller with ExternStoryboardSegue.

IB screenshot

于 2013-10-31T09:15:38.937 回答
16

从我的一个 XIB 文件中,我正在导航到 GUI 的一个更复杂的部分,对于这一部分,我使用的是 Storyboard。所以我的 XIB 中的一个按钮将导航到情节提要。我为此提供的代码是:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardIdentifier" bundle:nil];
UIViewController* myStoryBoardInitialViewController = [storyboard instantiateInitialViewController];

[self.navigationController pushViewController:myStoryBoardInitialViewController animated:YES];

这将成功地将我的 StoryBoard 推送到视图上。上面的代码是从按钮“Touch Up Inside”动作中调用的。

于 2012-04-24T08:49:35.820 回答
9

从 Xcode 7(并移植回 iOS8)开始,您现在可以拥有情节提要参考。在这个WWDC 2015会议中提到了它(它在第一个小时左右开始谈论它们)。基本上,您所要做的就是选择您希望移动到单独故事板的 ViewController,然后单击Editor->Refactor to Storyboard ...。给它一个名字,瞧:

在此处输入图像描述

请注意,如果您有 VC 被移到新故事板,并且没有在它之外引用(应该是什么),您应该从 main.storyboard 中删除它们的引用(放松它们将保留在新创建的故事板中,您是仅删除对它们的引用)。

于 2015-10-15T08:18:15.990 回答
7

苹果的文档说你可能有多个故事板。不幸的是,他们没有详细说明如何做到这一点。正如您所发现的,Interface Builder 不会帮助您,因此您必须在代码中完成。它的工作原理很像加载 XIB:

[UIStoryboard storyboardWithName:@”MyNewStoryboard” bundle:myBundle]

话虽如此,如果您不希望像您在评论中所说的那样“想要一个大/臃肿的故事板”,那么 XIB 确实是要走的路。这种“大”就是好处:风投之间的所有过渡都安排在一个地方。拥有多个故事板实际上是为了让您可以通过您的应用程序支持多个不同且不相关的流程:例如,一个故事板用于复杂的配置流,另一个故事板用于主要用户流。

于 2011-11-28T16:17:57.883 回答
3

Xcode 8.2.1

您可以在外部故事板中引用视图控制器。

从 TabBarController 到 Storyboard Reference 的关系

将连接从 拖到UITabBarController外部 Storyboard Reference,将其添加为“视图控制器”关系。在主情节提要中,它显示为“项目/正方形”,但在外部情节提要中,您应该添加一个UITabBarItem并定义选项卡的名称和图像。

在此处输入图像描述

选中时的属性检查Storyboard Reference器。

您还需要在其故事板中为外部控制器提供一个“故事板 ID” (此处未显示),并在参考中引用它的名称。

于 2017-01-17T18:53:59.133 回答
2

我发现,如果您在第二个故事板中有一个命名的 segue,您想在调用 performSegueWithIdenitfier: 时使用它:您必须在源 ViewController 的“身份”选项卡中设置“故事板 ID”字段。

例如,如果您将一个名为“ViewController1”的 VC 和一个名为“segue1”的 segue 提供给另一个 VC,请将“ViewController1”的“Storyboard ID”设置为任何值(例如“viewC1”或其他内容),然后在 ViewController1.m 中您可以使用 [self performSegueWithIdentifier:@"segue1" sender:self]。

于 2013-02-23T19:06:44.923 回答
1

请按照以下步骤完成此任务:

第 1 步Storyboard Reference在组件中搜索(请参阅屏幕截图)

第 2 步:选择新的故事板参考。(参考屏幕截图)

第 3 步:提供新的故事板名称和初始视图控制器标识符的标识符(请参阅屏幕截图)

在此处输入图像描述

构建并运行。它会工作。

于 2018-05-23T05:07:42.970 回答