尝试从界面构建器

时间:2015-06-08 01:37:09

标签: ios interface-builder xib initwithcoder

我有一个基于UIView的类,它有自己的XIB。让我们称这个班为MyClass。我有MyClass.xibMyClass.hMyClass.m

我在故事板上有一个UIView对象,我将该对象的类设置为MyClass

我创建了一个新的UIView XIB,在XIB中,我将文件所有者的类更改为MyClass。我不知道是否必须在XIB内部建立更多连接。

我想要的是:故事板加载MyClass.m并加载MyClass.xib,因此我有这个初始化代码:

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        NSString *className = NSStringFromClass([self class]);
        self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
        [self addSubview:self.view];
        return self;
    }
    return nil;
}

问题是此代码进入无限循环。我想loadNibNamed再次呼叫initWithCoder:,应用程序崩溃。

我该怎么做?为什么循环并且是否还有必须在xib内部建立连接?

3 个答案:

答案 0 :(得分:1)

让我们这样做

awakeFromNib方法启动它,例如

<{1>}文件中的

MyClass.m

答案 1 :(得分:0)

使用self.subviews.count == 0打破循环,如下所示:

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self && self.subviews.count == 0) {
        NSString *className = NSStringFromClass([self class]);
        self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
        [self addSubview:self.view];
    }
    return self;
}

答案 2 :(得分:0)

我已经尝试了所有答案,但这是唯一有效的代码,经过多次试验:

ThemeResource