从nib载入自定义的UIView,包含在nib中的所有子视图都是nil?

我有一个定义视图/子视图布局的自定义UIView对象。 我的sockets是连接的,当我从initWithFrame:初始化对象的initWithFrame:一切都是按顺序的。

我遇到的问题是当我使用IBembedded到另一个笔尖的UIView ; 自定义的UIView出现,但是它所包含的子视图都没有出现 – 实际上它们的符号全部parsing为零。 我有一个非常小的initWithCoder:awakeFromNib:实现(只是做日志logging),我的理解是,作为笔尖被反序列化的子视图至less应该在这个过程中初始化?

我自己唯一的结论就是发生了两件事情之一:要么我的sockets引用是腐败/坏,不能正常工作,要么我对从笔尖加载过程的理解是有缺陷的,我是遗漏了什么。

提前致谢!

编辑:(代码张贴为Nekto按要求…你会看到,它logging和多数民众赞成,嘿。)

 - (id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { NSLog(@"ThumbnailGridView.initWithCoder frame= %f, %f", self.frame.size.width, self.frame.size.height); } return self; } - (void)awakeFromNib { NSLog(@"ThumbnailGridView:awakeFromNib"); } 

编辑2:笔尖,控制器,子视图等

笔尖:我有一个包含UIView的笔尖。 这个UIView包含一个单一的UIScrollView,里面充满了在另一个nib中定义的UIViews的网格。 (注意:这部分工作正常,因为填充是以编程方式完成的,并且使用initWithFrame:call。)这里的问题是,在调用initWithCoder:和awakeFromNib:之后,UIScrollView符号为零,所以对象只是被添加到零,没有任何反应。 如果滚动视图符号不是零,我相信这将工作。

控制器:有两个控制器可以利用它,一个是使用initWithFrame完成的:完美工作,另一个embedded作为基于笔尖的参考。 (正如在这里其他地方提到的,在IB中定义一个UIView,设置自定义类。)我遍历代码,并且该视图被正确初始化 – 只有子视图“缺失”。

这是否有助于更清楚地了解情况?

你可能会误解nib加载的工作原理。 如果你定义了一个自定义的UIView并创build一个nib文件来展示它的子视图,那么你不能仅仅添加一个UIView到另一个nib文件中,把IB中的类名改为你的自定义类,并期待nib加载系统找出它。 您需要修改您的自定义UIView类的initWithCoder以编程方式加载定义其子视图布局的笔尖。 例如:

 - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil]; [self addSubview:self.toplevelSubView]; } return self; } 

您的自定义视图的nib文件需要将“文件所有者”类设置为您的自定义视图类,并且您的自定义类中需要有一个名为“toplevelSubView”的插口连接到自定义视图nib文件中的视图,该视图充当所有子视图的容器。 添加额外的网点到你的视图类,并连接到“文件的所有者”(您的自定义UIView)的子视图。

或者,只需编程创build自定义视图,并绕过IB。

检查你是否正在调用每个重写的方法中的initWithCoder:和awakeFromNib的超级实现

 - (id)initWithCoder:(NSCoder *)decoder { if ((self = [super initWithCoder:decoder])) { ...your init code... } return self; } - (void)awakeFromNib { [super awakeFromNib]; ...your init code... }