1

我有一个文件,View.xib其中包含三个UIViews,每个都是相同的 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 循环是关键部分。)

但是当我UIView在我的其他文件中添加 nib 时,指标没有四舍五入,因为上面的代码应该完成:

    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

4

1 回答 1

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。:) IBOutlets 之前没有加载initWithCoder:。你需要改为陷阱awakeFromNib

来自 Apple 的文档:

nib 加载基础结构向awakeFromNib从 nib 存档重新创建的每个对象发送一条消息,但前提是存档中的所有对象都已加载和初始化。当一个对象收到一条awakeFromNib消息时,它保证已经建立了它的所有出口和动作连接。

你会这样做:

- (void)awakeFromNib
{
    [super awakeFromNib];
    for (UIView *circle in self.circles) {
        circle.layer.cornerRadius = circle.bounds.size.width / 2;
    }
}
于 2013-11-06T22:16:40.703 回答