如何在 iOS 中从 NIB 加载 NIB

Posted

技术标签:

【中文标题】如何在 iOS 中从 NIB 加载 NIB【英文标题】:How to load a NIB from NIB in iOS 【发布时间】:2015-04-28 23:18:01 【问题描述】:

我通过 XIB 创建了 CustomViewController。

我还通过不同的 XIB 文件创建了 CustomView,它是 os UIView 的子类。

然后我将 UIView 绑定到 CustomViewController 并将其类设置为 CustomView。

问题在这里:然后我运行这个应用程序我没有看到我在 CustomView XIB 中创建的 CustomView 的内容。

为什么以及如何解决?

我需要在 CustomViewController 中有 CustomView,因为我需要设置这个视图的布局。

我可以从 ViewDidLoad 加载这个 CustomView,但我需要从 XIB 加载它

UIView *v = [[[NSBundle mainBundle] loadNibNamed:@"TopSegmentedControl" owner:self options:nil] firstObject ];
[self.view addSubview:v];

【问题讨论】:

我认为这不可能。您也许可以在加载 xib 文件的类上使用 IBDesignable。 尝试覆盖 initWithCoder: 在你的 UIView 子类中返回 [[[NSBundle mainBundle]..//etc]]; 杰夫,我试过了,有错误 【参考方案1】:

我认为您应该考虑更改您的 UIView 子类,使其继承自 UIViewController,并作为子 ViewController 添加到层次结构中。如果你这样做了,那么你可以从界面构建器中的检查器托盘中添加 containerView 对象到外部 viewControllers 视图中,它会在那里添加新的(笔尖内的笔尖)供您将所有内容粘贴到..

我认为根据 cocoa 和 cocoaTouch 最近的变化,Apple 不希望我们从 nib 加载简单视图。请注意,顶部的“文件所有者”代理现在标记为“ViewController”

【讨论】:

绝对是我的建议。 我怎样才能在这里进行自动布局?此视图未针对不同设备调整大小【参考方案2】:

您必须将包含在其中的代码放入 UIViewController 的 initWithCoder: 方法中。这是从情节提要初始化时调用的初始化方法。假设您已将一个名为 myView 的插座连接到它:

- (id)initWithCoder:(NSCoder *)aDecoder 
    if ((self = [super initWithCoder:aDecoder])) 
        self.myView = [[[NSBundle mainBundle] loadNibNamed:@"TopSegmentedControl" owner:self options:nil] firstObject];

        return self;
    

【讨论】:

我怎样才能在这里进行自动布局?此视图未针对不同设备调整大小

以上是关于如何在 iOS 中从 NIB 加载 NIB的主要内容,如果未能解决你的问题,请参考以下文章

如何在 init 方法中从 NIB 加载 IBOutlets?

如何在框架内加载 `.xib` / `.nib` 文件?

IOS:如何使从 nib 文件加载的子视图可以使用它的按钮(IBAction)

如何获取从 nib ios 加载的自定义视图的实际大小

如何在不将 nib 名称指定为字符串的情况下使用 nib 加载 View Controller 子类?

如何在 SWIFT 中以编程方式将我的自定义控制器变成根控制器? (无法加载 NIB)