如何使用RBStoryboardLink在多个storyboard文件中嵌入segue?

时间:2014-08-12 07:35:02

标签: ios objective-c

我一直在使用RBStoryboardLink将单片iOS故事板文件分解为一些更易于管理的故事板。 RBStoryboardLink支持允许Push,Popover和Modal segue跨故事板文件进行转换,但我也在寻找一种解决方案来处理嵌入segue。

通过在线搜索找不到任何明显的内容,我已在下面的答案中记录了我的解决方案,以防其他人使用。

1 个答案:

答案 0 :(得分:1)

Xcode 7更新

从Xcode 7开始,RBStoryboardLink的使用可能会替换为原生的 Storyboard reference 功能,该功能还允许跨故事板进行分段。它仅适用于针对iOS 8,10.10和Watch OS 1的应用(请参阅Xcode 7.0 release notes)。

原始回答

警告:此解决方案涉及手动编辑故事板XML文件,因为Xcode的Interface Builder UI不允许为Embed segues指定自定义类。使用此方法需要您自担风险!

熟悉使用RBStoryboardLink的说明。该方法或多或少遵循相同的过程,最后还有一些额外的步骤用于编辑故事板XML。

  1. 子类RBStoryboardSegue:

    @interface RBStoryboardEmbedSegue : RBStoryboardSegue
    @end
    @implementation RBStoryboardEmbedSegue
    
    - (void)perform
    {
        // Manually simulate an 'embed' segue. Local UIViewController variables avoid compiler warnings in Xcode 6.0b5.
        UIViewController* source = self.sourceViewController;
        UIViewController* destination = self.destinationViewController;
        [source addChildViewController:destination];
        [source.view addSubview:destination.view];
        [destination didMoveToParentViewController:source];
    }
    @end
    
  2. 在Interface Builder中,将Container View拖放到父视图控制器中。 Interface Builder为您创建嵌入segue和目标UIViewController。此目标视图控制器将充当“真实”视图控制器的“代理”,该控制器驻留在其他故事板文件中。

  3. 将刚刚创建的目标UIViewContoller的类设置为RBStoryboardLink。

  4. 在代理视图控制器上设置适当的用户定义的运行时属性。至少,将 storyboardName 设置为“其他”情节提要文件的名称(不包括任何路径扩展名),其中包含您希望在运行时嵌入的真实目标视图控制器。

  5. 选择新创建的嵌入segue,并在Interface Builder的属性检查器中为其指定唯一标识符。

  6. 由于Interface Builder的UI不允许指定自定义嵌入segue类,我们需要手动执行此操作。在XML编辑器中打开包含嵌入segue的storyboard文件,并搜索segue的唯一标识符。它将位于< segue> 元素中,看起来像这样:

    <segue destination="0yd-AT-CHi" kind="embed" identifier="MySegue" id="kx9-F0-BST"/>
    
  7. 通过在 segue 元素中添加 customClass 属性来设置segue的自定义类:

    <segue destination="0yd-AT-CHi" kind="embed" identifier="MySegue" customClass="RBStoryboardEmbedSegue" id="kx9-F0-BST"/>
    
  8. 构建并运行您的应用。

  9. Xcode的Interface Builder的Attributes Inspector无法识别自定义类属性,因此一些Interface Builder编辑操作(例如编辑segue的标识符)很可能会重写segue元素并省略手动编辑的更改。 (我已经向Apple提交了Radar / Bug Report 17987173,要求对自定义嵌入式segue类提供适当的支持。)

    好奇的是,将种类属性的值从 embed 更改为自定义并不能提供所需的结果。它会沿着“[setValue:forUndefinedKey:]生成运行时异常:此类不是密钥容器视图的密钥值编码。”。