在哪里初始化自定义UIView,在Interface Builder中实例化?

Rit*_*its 11 iphone cocoa-touch objective-c uikit

我有一个UIView的子类,它在XIB文件中实例化.我需要它做一些初始化(设置一些变量和创建子视图).

但是,我并不总是通过Interface Builder实例化此视图.我也是以编程方式完成的.在这两种情况下,初始化都需要相同.

我指定的初始化程序是initWithValues:.

问题是; 我在哪里进行初始化?

由于我必须在两个不同的位置执行它,我想我需要在一个单独的initialize方法(或类似的东西)中重构它,并从中调用它initWithValues:.

不过从IB加载时,无论是initWithCoder:awakeFromNib被调用.我必须从哪个方法打电话initialize?或者我必须打电话initWithValues:initWithCoder:什么都不做awakeFromNib

nac*_*o4d 17

您应该initWithFrame:在初始化视图时使用(因为它是指定的初始化程序).因此,如果您initWithValues:确保initWithFrame:从中拨打电话.

这样的东西应该用于初始化:;)

- (void)initialize{
     //init your ivars here
}

- (id)initWithCoder:(NSCoder *)aCoder{
    if(self = [super initWithCoder:aCoder]){
        [self initialize];
    }
    return self;
}

- (id)initWithFrame:(CGRect)rect{
    if(self = [super initWithFrame:rect]){
        [self initialize];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我打算补充说明,但是mplappert的答案很清楚.awakeFromNib必要时使用.


mpl*_*ert 10

这取决于您需要初始化的内容.一旦awakeFromNib被调用,您的视图的所有出口和操作连接都会建立,而不是这样initWithCoder:.因此,如果您需要依赖这些连接,请使用awakeFromNib.否则,您可以安全地进行所有初始化initWithCoder:.