在iOS中使用多个故事板

Dad*_*See 75 user-interface ios ios5 xcode4.2 uistoryboard

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

故事板截图

我的主板是一个标签视图.

然后我创建了一个带有2个View Controller的辅助故事板(故事板#2).第一个视图控制器(也标记为初始)有一个按钮,并且segue(模态)有第二个视图.第一视图控制器

我设法通过从故事板#2继承和覆盖loadView来加载视图. loadView覆盖

这是模拟器输出.

模拟器

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

有没有人试图这样做,并让它工作?有来自SkillMaster.net的youtube视频,但他没有证明s​​egue是否在次要故事板下工作.视频在这里:http://youtu.be/D4_twoYvB4M

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

截图:

Rhu*_*arb 79

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

他不仅告诉你如何在代码中创建一个新的故事板

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

请注意,最后一点很重要,因为多个故事板的关键缺点是你通常不能将它们与segue链接,但是robs库允许它有点捏造

另见这里讨论的内容


pch*_*10k 44

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

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

initialHelpView.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:initialHelpView animated:YES];
Run Code Online (Sandbox Code Playgroud)

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

  • 这个问题已从SO中删除:-(.无论如何,你觉得你会把这个片段放在这个用例中吗?我面临同样的情况,我无法真正看到我可以在哪里与`UITabbarController挂钩`为每个选项卡实例化正确的故事板.委托`tabBarController:shouldSelectViewController:`是否合适? (2认同)
  • 我正在使用上述方法,但没有使用标签栏.我将此代码放在按钮选择器指定的操作方法中.在我将segued-to场景移动到自己的故事板之前,基本上代码与prepareForSegue中的代码相同.我最初犯的一个错误是我的新故事板将其主视图嵌入到UINavigationController中 - 在设置之后我尝试呈现视图而不是导航控制器. (2认同)

vok*_*lam 19

我研究了Rhubarb建议的RBStoryboardLink方法.此实现替换视图控制器的看起来很奇怪的属性.我相信我找到了避免这种情况的方法.这是演示项目.

导航控制器

导航控制器可以将引用的视图控制器设置为根.这种视图控制器的实现可能如下所示:

@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
Run Code Online (Sandbox Code Playgroud)

查看控制器

如果要推送外部故事板中定义的视图控制器,问题就会开始.复制属性时就是这种情况.取而代之的是,我们可以实现一个自定义segue,它将伪造的目标控制器替换为来自外部故事板的真实目标控制器.

@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
Run Code Online (Sandbox Code Playgroud)

ExternViewController用作占位符,包含替换属性(storyboardName和sceneIdentifier)所需.

@interface ExternViewController : UIViewController

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

@end

@implementation ExternViewController

@end
Run Code Online (Sandbox Code Playgroud)

我们需要为占位符视图控制器设置这些属性和自定义类.并且还将视图控制器与ExternStoryboardSegue链接.

IB截图


Joa*_*eie 16

从我的一个XIB文件导航到GUI的一个更复杂的部分,对于这部分我使用的是Storyboard.因此,我的XIB中的按钮将导航到故事板.我的代码是:

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

[self.navigationController pushViewController:myStoryBoardInitialViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

这将成功将我的StoryBoard推送到视图上.上面的代码是从"Touch Up Inside"按钮调用的.


hri*_*.to 9

从Xcode 7开始(并移植回iOS8),您现在可以获得故事板参考.在WWDC 2015会议上提到过(它开始在第一个小时左右开始谈论它们).基本上所有你需要做的是要移动到不同的故事板,然后单击选择视图控制器的编辑- >重构至脚本.......给它一个名字,瞧:

在此输入图像描述

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


Tim*_*Tim 7

Apple的文档说你可能有多个故事板.不幸的是,他们没有详细说明如何做到这一点.正如您所知,Interface Builder不会帮助您,因此您必须在代码中执行此操作.它的工作方式与加载XIB非常相似:

[UIStoryboard storyboardWithName:@”MyNewStoryboard” bundle:myBundle]
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果你没有像你在评论中所说的那样"想要一个大/臃肿的故事板",那么XIB真的是要走的路."重大"就是好处:风险投资之间的所有过渡都在一个地方进行.拥有多个故事板确实可以通过您的应用程序支持多个不同且不相关的流:例如,一个故事板用于复杂的配置流,另一个用于主用户流.

  • 最大的问题是当你在一个3+团队工作时,合并一个故事板是一场噩梦. (25认同)
  • 您不必为了避免合并恶梦而放弃故事板提供的所有舒适感.只需隔离不同的独立区域并为每个区域分配一个单独的故事板.您仍将拥有所有内部过渡的故事板的所有魔力.选项卡式应用程序非常适合此方案.设置屏幕也是.即使您是单个开发人员,也可能仍然需要将您的故事板分成几个独立的部分. (4认同)
  • 我可以想象这是一个问题.故事板上有很多粗糙的边缘; 你的观点还有一点. (2认同)