文件的所有者不会接到电话
-(id) initWithCoder:(NSCoder *) coder;
加载 xib 时。
但是,该 xib 中定义的每个视图都会调用
-(id) initWithCoder:(NSCoder *) coder;
加载 xib 时。
如果您在 xib 中定义了 UIView 的子类(即 GridCell),并且还尝试在子类的 initWithCoder 中加载相同的 xib,您将最终陷入无限循环。但是,我看不到用例会是什么。
通常,您在一个 xib 中设计 UIView 的子类(即 GridCell),然后在视图控制器的 xib 中使用该子类。
此外,看不到您的自定义视图将在其 initWithCoder 中包含子视图的用例,即
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
if (self.subviews.count == 0) {
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
UIView *subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
subview.frame = self.bounds;
[self addSubview:subview];
}
}
return self;
}
除非您希望能够在其他一些 xib 中按需覆盖其视图层次结构。哪个 IMO 假定一个外部依赖项(即在另一个 xib 中定义的层次结构)并且有点违背了首先拥有可重用 UIView 的目的。
请记住,在加载 xib 时,将实例作为文件的所有者传递,将设置其所有 IBOutlet(s)。在这种情况下,您将用 GridCell.xib 中的任何根视图替换 self(即 GridCell),从而在此过程中丢失所有 IBOutlet 连接。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"GridCell" owner:self options:nil];
self = [nib objectAtIndex:0];
self.frame = frame;
}
return self;
}
有一篇关于“如何实现可重用的 UIView ”的更详细的帖子。它也更详细地介绍了一些内容,并希望能把事情弄清楚。