【问题标题】:Launch Storyboard from within Nib?从 Nib 内启动 Storyboard?
【发布时间】:2012-04-18 10:10:10
【问题描述】:

我正在考虑使用storyboards 提供的新功能重建我的应用程序的设置部分。此时不想接触我的应用程序的其余部分,所以我的主要NIB 将留下来。

现在,当从我的 NIB'ed tabBar 转到另一个 NIB 时,我只需在 IB 中将 viewController 添加到 tabBar,然后将 NIB Name 属性设置为 NIB想要在按下该选项卡时加载。

但是我看不到“故事板名称”属性,那么这是如何完成的呢?

【问题讨论】:

    标签: xcode ios5 interface-builder storyboard


    【解决方案1】:

    目前没有“官方”的方式来做到这一点,但你可以使用一些技巧来做到这一点。

    1) 以通常的方式将视图控制器添加到 nib 中的标签栏。将笔尖字段留空。

    2) 创建您的故事板并添加您的视图控制器。设置类并设置情节提要 ID(我将在此示例中使用“theID”)

    3) 将静态布尔变量添加到您的 .m 文件、外部实现或接口

    static BOOL aFlag = NO;
    

    4) 在您的 viewcontroller 类中覆盖此方法:

    - (id) awakeAfterUsingCoder:(NSCoder *)aDecoder
    {
        if (!aFlag){
            aFlag = YES;
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
            return [storyboard instantiateViewControllerWithIdentifier:@"theID"];
        } else {
            return self;
        }
    }
    

    基本上:

    • 当您从标签栏 nib 加载对象时,会首次调用“initWithCoder”,并且对象会在没有 nib 的情况下加载
    • 在 initWithCoder 之后,将调用 awakeAfterUsingCoder,然后将对象替换为从情节提要加载的另一个对象。同一类但存档在情节提要中的对象
    • 当您从情节提要加载对象时,会再次调用 initWithCoder 和 awakeAfterUsingCoder。您使用该标志来避免循环并返回 self(在第二次调用时,对象是从情节提要加载的,因此返回 self 是可以的)

    我试过了,效果很好 ;-) 如果你想要这里是一个示例项目:http://www.lombax.it/files/testTabNib.zip

    【讨论】:

    • 它起作用了,但由于某种原因,TabBarItem 的图像消失了……知道为什么吗?
    • 标签栏项(出现在标签栏上的按钮)是视图控制器的属性,而不是标签栏的属性。因此,您必须在 storyboard 中的新 ViewController 中添加一个 Tab Bar Item。您可以以编程方式或简单地以图形方式执行此操作。从 ViewController 下的对象库中拖放一个新的选项卡栏项(作为子项)
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多