[英]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.