【问题标题】:How to instantiate a custom iOS UIViewController and use it's NIB under Storyboard?如何实例化自定义 iOS UIViewController 并在 Storyboard 下使用它的 NIB?
【发布时间】:2013-03-22 18:11:38
【问题描述】:

我有一个带有 StoryBoard (iOS 5+) 的项目,有两个 UIViewController。

任务是以编程方式实例化第二个 UIViewController (CoordinationController),但我想将它的 XIB 文件用于用户界面设计。

由于未记录的原因,将 XIB 复制到 StoryBoard 的明显解决方法不起作用或无法使用。 甚至规则是,如果第二个故事板的视图控制器没有视图,它将寻找同名的 XIB... 不起作用。

如何实例化第二个 UIViewController 并使用它的 XIB 文件?

【问题讨论】:

    标签: ios uiviewcontroller storyboard xib nib


    【解决方案1】:

    您可以加载 nib 文件并在 CoordinationController 的 initWithCoder: 方法中设置您的视图:

    -(id)initWithCoder:(NSCoder *)aDecoder {
        if (self = [super initWithCoder:aDecoder]) {
            UINib *nib = [UINib nibWithNibName:@"CoordinationController" bundle:nil];
            NSArray *nibObjects = [nib instantiateWithOwner:self options:nil];
            self.view = nibObjects.lastObject;
        }
        return self;
    }
    

    【讨论】:

    • 没关系,谢谢,但我也想在 FirstViewController 中看到实例化。只是一个额外的问题:它也可以与 segue 一起使用吗?
    • @BootMaker,我不明白你的意思。 FirstViewController 也是 CoordinationController 的子类吗?
    • 不,它是一个不同的控制器,实际上是第一个控制器或RootController,但重要的是它如何实例化CoordinationController。
    • @BootMaker,您的意思是要从FirstViewController 实例化CoordinationController?如果是这样,只需从 FirstViewController 连接一个 segue 到它。当 segue 运行时,会调用 CoordinationController 的 iniWithCoder: 方法。
    • 好的,谢谢这是对奖金问题的回答。但实际上我的问题是,您将使用哪个代码从 FirstViewController 实例化 CoordinationController 而无需 segue,我的意思是通过编程方式?
    【解决方案2】:

    一个非常简单的解决方案是覆盖视图控制器的nibName 属性并返回对您要加载的视图进行编码的 nib 的名称:

    - (NSString*) nibName
    {
        NSLog( @"p.s. this is the nib that the storyboard generated: %@", [super nibName]);
    
        return @"MyViewController";
    }
    

    请注意,您可以访问故事板编译器生成的 nib 的名称,该名称将被使用。这个 nib 包含在 app bundle 中,打包在 storyboard.storyboardc bundle 中。

    我有点惊讶你不能从这个 nibName 实现中返回 nil 并获得加载程序使用 rules described in the docs 搜索 nib 的默认行为。

    或者(这是作弊)您可以通过用户定义的运行时属性和键 nibName 在 Storyboard 本身中为视图控制器设置所需的 nib 名称。这是有效的,因为该属性有一个未记录的设置器,所以实际上不要这样做!

    我认为这是一个比已接受的答案更好的解决方案,因为视图将在视图控制器生命周期的正常过程中加载 - 也就是说,它将在控制器出现之前延迟加载,而不是在 init 中预先加载方法。而且代码更少。

    【讨论】:

    • 我有一种情况,我需要显示多个 .xib,但只使用一个视图控制器。我用这个和一个单例解决了它。 .xib 名称在单例属性 NSString *xibName 中设置。然后从情节提要中实例化视图控制器。内部 - (NSString *) nibName 我添加了一行获取并返回 xibName。完美运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2015-05-30
    • 2018-08-06
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多