【问题标题】:Instantiating a UIView from a XIB file with itself as the file's owner?从一个 XIB 文件中实例化一个 UIView 并作为文件的所有者?
【发布时间】:2014-07-10 22:19:30
【问题描述】:

假设我有一个 XIB 文件 (MyView.xib),其中包含一个根 UIView,其类是一些自定义 UIView 子类 (MyView)。

我想从 XIB 文件创建 MyView 的一个实例(在代码中),但我也希望文件的所有者是 MyView 本身的实例(这样我就可以将 IBOutlets 从 XIB 链接到代码)。

换句话说,MyView 是 XIB 中根视图的类,它也被设置为文件的所有者类。

我在 MyView 实现中尝试过这样的事情:

- (id)initFromNib {
    self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject];
    return self;
}

然后我意识到这没有任何意义,因为此时 self 为 nil,因此文件的所有者设置为 nil(不好)。

这开始感觉像是鸡蛋问题,因为在创建之前,我需要文件的所有者是即将创建的实例。

然后我尝试了这样的事情:

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:CGRectMake(0.0, 0.0, 310, 166)];
    if (self) {
        self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject];
    }
    return self;
}

显然,这是一个临时的 hack,只是想看看它是否可行,但不行。视图已加载并正确显示,但当我按下其中一个按钮(具有关联的 IBAction)时应用程序崩溃。

我是否遗漏了一些明显的东西?还是我的理解在某些方面有缺陷?

一般的问题是我只想拥有一个自定义 UIView 子类和一个关联的 XIB,其中包含该视图的视觉表示,并且我还希望能够在 XIB 与其对应的 UIView 子类之间关联 IBOutlets。

欢迎提出任何建议。

【问题讨论】:

    标签: ios uiview interface-builder xib


    【解决方案1】:

    经过一番挖掘,我找到了一种解决方法。基本上,我没有将我的 IBOutlets 和 IBActions 链接到文件的所有者,而是将它们直接链接到根视图的类(它具有通过自定义子类公开的 IB 属性)。

    关键是不要依赖文件的所有者,而是将出口和操作直接连接到自定义视图。

    这是我最终使用的初始化程序:

    - (instancetype)initFromNib {
        return [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil] firstObject];
    }
    

    这似乎工作正常。

    更新

    我在 UIView 上创建了一个类别,用于从 XIB 初始化视图(它假定 XIB 名称与类名相同)。

    UIView+Initialization.h

    #import <UIKit/UIKit.h>
    
    @interface UIView (Initialization)
    
    - (instancetype)initFromNib;
    
    @end
    

    UIView+Initialization.m

    #import "UIView+Initialization.h"
    
    @implementation UIView (Initialization)
    
    - (instancetype)initFromNib {
        return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:nil options:nil] firstObject];
    }
    
    @end
    

    然后你可以简单地做:

    MyView *myView = [[MyView alloc] initFromNib];
    

    假设您有一个带有根视图的 MyView.xib 文件,该文件的类是 MyView。

    【讨论】:

    • 当我将 IB 中 Xib 的文件所有者设置为 CustomClass 时,这对我不起作用。相反,应该将视图设置为 xib 中的自定义类,我相信就是这样。
    • 您知道在这种情况下 MyView 类是否能够接收 UI 事件?因此,如果我认为有一个 IBAction 会被适当地调用吗?据我了解,事件已发送给文件的所有者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多