繁体   English   中英

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

[英]Where to initialize custom UIView, instantiated in Interface Builder?

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

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

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

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

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

但是从IB加载时,会调用initWithCoder:awakeFromNib 我必须从哪个方法调用initialize 还是我打电话initWithValues:initWithCoder:和什么也不做awakeFromNib

您应该使用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;
}

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

这取决于您需要初始化的内容。 一旦调用了awakeFromNib就会建立视图的所有出口和动作连接,这与initWithCoder:的情况不同initWithCoder: 因此,如果您需要依赖这些连接,请使用awakeFromNib。 否则,您可以安全地在initWithCoder:进行所有初始化initWithCoder:

不幸的是,上面的答案没有考虑到这些: - (void)awakeAfterUsingCoder - 以及在编码器创建任何内容之后调用它的事实(每次Xib视图一次)。 我注意到,awakeFromNib遭遇同样的命运。 (我找到这个的原因)

另一个初始化问题是可以避免自定义视图使用initWithCoder和initWithFrame。 如果它们被调用,延迟加载(虽然对视图本身不那么重要),意味着你“可能”能够修改值。 我相信我已经在initWithCoder中这样做了,但如果你在awakeFromNib中初始化值,它至少会撤消一次。

我到目前为止:

- (void) awakeFromNib (or didMoveToSuperView);
{
    BOOL called = NO;
    if(!called)
    {
    called = YES;
    }

}

我使用的另一种方法是简单地调用所需的初始化程序,然后调用我自己的类或特定于超类的初始化程序。

我也在寻找一个可以依赖的可靠的一次性地方。 在那之前,我希望我的头痛能在一个小时左右的时间内拯救下一个人。

史蒂夫

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM