1

同じ UIView サブクラスのそれぞれにView.xib3 つの が含まれるファイルがあります。UIViewビューはすべて少し異なって見えますが、チュートリアル画面のページとして使用されるため、下部にページ インジケーターがあります。

各ページに 3 つのページ インジケーターのアウトレット コレクションを作成しました。そのため、カスタムUIViewでアウトレット コレクションを作成し、3 つのビューのそれぞれについて、3 つのページ インジケーターすべてをアウトレット コレクションに接続しました。

ただし、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 に答える