web-dev-qa-db-ja.com

nibからカスタムUIViewをロードすると、nibに含まれるすべてのサブビューはnilですか?

ビュー/サブビューレイアウトを定義するUIViewを持つカスタムnibオブジェクトがあります。コンセントが接続されており、initWithFrame:すべてが順調です。

私が抱えている問題は、IBを使用してUIViewを別のペン先に埋め込むときです。カスタムUIViewは表示されますが、それに含まれるサブビューは表示されません。実際、それらのシンボルはすべてnilに解決されます。最小限のinitWithCoder:およびawakeFromNib:実装(ロギングのみ)と私の理解では、nibが非シリアル化されると、サブプロセスは少なくともプロセス中に初期化される必要があるということです。

私が自分で考えている唯一の結論は、2つの事柄のいずれかが起こっているということです:アウトレット参照が破損/不良で動作していないか、またはロードからnibプロセスの理解に誤りがあり、何かが欠けています。

前もって感謝します!

編集:(要求に応じてNektoに投稿されたコード...ご覧のように、ロギングを行い、それで終わりです。)

- (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には、別のペン先で定義されたUIViewのグリッドで満たされた単一のUIScrollViewが含まれます。 (注:塗りつぶしはプログラムで行われ、initWithFrame:呼び出しで動作するため、この部分は正常に動作します。)ここでの問題は、initScrollCoder:およびawakeFromNib:が呼び出された後、UIScrollViewシンボルがnilであるため、オブジェクトが追加されているだけであるなし、何も起こりません。 scrollviewシンボルがnilでない場合、これが機能すると確信しています。

コントローラー:これを利用するコントローラーは2つあります。1つはinitWithFrameで実行され、完全に動作します。もう1つはnibベースの参照として埋め込みます。 (ここで他の箇所で述べたように、IBでUIViewを定義し、カスタムクラスを設定します。)コードをステップ実行すると、そのビューは正しく初期化され、そのサブビューのみが「欠落」しています。

これにより、状況をより明確に把握できますか?

31
strahlr

ペン先のロードの仕組みを誤解している可能性があります。カスタムUIViewを定義し、そのサブビューをレイアウトするnibファイルを作成する場合、UIViewを別のnibファイルに追加するだけでなく、IBのクラス名をカスタムクラスに変更し、nibロードシステムがそれを理解することを期待できます。カスタムUIViewクラスのinitWithCoderを変更して、サブビューレイアウトを定義するnibをプログラムでロードする必要があります。例えば。:

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

カスタムビューのnibファイルには、「File's owner」クラスをカスタムビュークラスに設定する必要があり、カスタムビューnibファイルのビューに接続されている「toplevelSubView」というカスタムクラスのアウトレットを、すべてのサブビューのコンテナ。ビュークラスに追加のアウトレットを追加し、サブファイルを「ファイルの所有者」(カスタムUIView)に接続します。

または、プログラムでカスタムビューを作成し、IBをバイパスします。

51

オーバーライドされた各メソッドでinitWithCoder:およびawakeFromNibの「スーパー」実装を呼び出していることを確認します。

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

- (void)awakeFromNib {
     [super awakeFromNib];
     ...your init code...
}
5