3

コンポーネントをXIBファイルで外部化したので、いくつかの異なるビューで再利用できます。次に、View Controllerで、XIBベースのUIViewをロードし、次の方法で現在のビューに追加します。

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil];
_likePreview = [views objectAtIndex:0];
[self.view addSubview:_likePreview];

最初は、機能していないと思っていましたが、実際には機能していますが、ルートビュー(つまり、透明なすべてのグラフィカルコンポーネントのコンテナ)をビューに配置するだけです。

だから私はそれを機能させるために(すべてのサブコンポーネントに対して)この種のコードを置く必要があります:

[self.view addSubview:_likePreview];
NSArray *subviews = _likePreview.subviews;
for(UIView * subview in subviews) {
    [self.view addSubview:subview];
}

これは非常に直感に反し、さらに、私が望むビュー階層を作成しないと思います。

XIBからカスタムテーブルヘッダーをロードするためにUITableViewControllerで同じ種類のことを行ったので、解決策があると確信しています。この状況でまったく同じXIBファイルを使用すると、すべてが正しくロードされます。コードは次のとおりです。

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    switch(section) {
        case 0: {
            NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil];
            _likePreview = [views objectAtIndex:0];
            return _likePreview;
        }
    }
    return [super tableView:tableView viewForHeaderInSection:section];
}

上記のコードでは、すべてが正常であり、テーブルセクションのヘッダーとしてビュー全体(=すべてのコンテンツを含むルートビューコンテナ)を取得しました。

したがって、問題は次のとおりです。最初の例で何が間違っているのでしょうか。すべてのコンテンツ(コンテナ+すべてのコンテンツ)を適切なUIView階層として親UIViewに追加するにはどうすればよいですか?

編集:次のように、すべてが単一のルートUIViewのXIBファイルに整理されていることを正確にする必要があります(画像を投稿できません):

* Thumbs preview view
|_ Button
|_ Image View
|_ Image View
|_ Image View
|_ Image View
|_ Button
|_ Button
|_ Button
|_ Label

ご助力ありがとうございます !

クリストフ

4

1 に答える 1

3

コンポーネントをロードする1つの方法は、コンポーネントを最上位UIViewのオブジェクト(添付のスクリーンショット)に保存することです。


(出典:mobypicture.com

その後、通常どおりペン先をロードし、を使用-addSubview:してコンポーネントをビュー階層に追加できます。

編集:

ペン先をロードする

UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"testView" owner:self options:nil] objectAtIndex:0];

を使用してビューをビュー階層に追加します

[self.view addSubview:view];

次のビュー階層につながります。

(lldb) po [[self view] recursiveDescription]
(id) $1 = 0x088487b0 <UIView: 0x89595b0; frame = (0 0; 320 548); autoresize = W+H; layer = <CALayer: 0x8958b30>>
   | <UIView: 0x89755c0; frame = (0 0; 320 200); autoresize = RM+BM; layer = <CALayer: 0x8975080>>
   |    | <UIView: 0x8975620; frame = (200 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8975680>>
   |    | <UIView: 0x8975700; frame = (20 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8974ea0>>
   |    | <UIRoundedRectButton: 0x8975790; frame = (20 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8975890>>
   |    |    | <UIGroupTableViewCellBackground: 0x8976030; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8976100>>
   |    |    | <UIImageView: 0x89768d0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x89770f0>>
   |    |    | <UIButtonLabel: 0x8977af0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8977be0>>
   |    | <UIRoundedRectButton: 0x8978990; frame = (227 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8978a60>>
   |    |    | <UIGroupTableViewCellBackground: 0x8978a90; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8978b10>>
   |    |    | <UIImageView: 0x8978b80; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8979230>>
   |    |    | <UIButtonLabel: 0x8978be0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8978cd0>>
于 2012-10-16T09:52:03.877 に答える