为什么我不能操纵我的xib文件中的对象?

时间:2013-11-06 22:14:46

标签: ios objective-c uiview xib nib

我有一个文件,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

1 个答案:

答案 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;
    }
}