我有一个文件,View.xib
,其中有三个UIView
,每个都是相同的UIView子类。所有视图看起来都有所不同,但它们将在教程屏幕中用作页面,因此它们底部有页面指示符。
我在每页上制作了三页指示符的插座集。因此,在自定义UIView
中,我制作了一个插座集合,并且对于三个视图中的每一个,我将所有三个页面指示符连接到插座集合。
但是,在initWithFrame:
我执行以下操作:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
for (UIView *pageIndicator in self.pageIndicators) {
pageIndicator.layer.cornerRadius = pageIndicator.bounds.size.width / 2;
}
}
return self;
}
(for循环是关键部分。)
但是当我在我的另一个文件中从nib添加UIView
时,指标不会被舍入,因为上面的代码应该完成:
TutorialScreen *tutorialScreen1 = [[[NSBundle mainBundle] loadNibNamed:@"View" owner:nil options:nil] objectAtIndex:0];
tutorialScreen1.layer.cornerRadius = 8.0;
[self.notificationWindow addSubview:tutorialScreen1];
我做错了什么?
不起作用的示例项目:http://cl.ly/170O2u10181V
答案 0 :(得分:3)
从nib / xib读取对象时,会使用initWithCoder:
对其进行初始化。覆盖它并执行相同的操作(或者,更好的是,将其移动到同时调用的方法)。
- (void)mySetup
{
for (UIView *pageIndicator in self.pageIndicators) {
pageIndicator.layer.cornerRadius = pageIndicator.bounds.size.width / 2;
}
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self mySetup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self mySetup];
}
return self;
}
在查看您的项目后,您遇到了另一个问题。你没有提到你试图使用IBOutlets。 :)在initWithCoder:
之前未加载IBOutlets。您需要代替awakeFromNib
。
来自Apple的文档:
nib-loading基础结构向从nib存档重新创建的每个对象发送
awakeFromNib
消息,但仅在存档中的所有对象都已加载并初始化之后。当一个对象收到awakeFromNib
消息时,保证其所有出口和操作连接已经建立。
你这样做:
- (void)awakeFromNib
{
[super awakeFromNib];
for (UIView *circle in self.circles) {
circle.layer.cornerRadius = circle.bounds.size.width / 2;
}
}