4

ストーリーボードに を構築しUICollectionView、必要なデータ ソースとデリゲート メソッドをすべてビュー コントローラーに実装しました。ストーリーボードで、コレクション ビューのプロパティを確認しSection Header、ヘッダー ビューのクラスをUICollectionResusableView(ストーリーボードで) のサブクラスに設定しました。

ここから、ストーリーボードを介して 2 つの UI 要素 (ラベルとセグメント化されたコントロール) をヘッダー ビューにドラッグします。

ここに画像の説明を入力

プログラムが実行されると、コレクション ビューのヘッダー ビューにラベルが表示されますが (実際のコードは必要ありません)、セグメント化されたコントロールには表示されません。ただし、セグメント化されたコントロールを通常UIViewの にドラッグすると、表示され、コードを必要とせずに操作できます。のコードでインスタンス化してもIBOutlet、セグメント化されたコントロールは表示されません。

セグメント化されたコントロールが通常のコレクション ビューのヘッダーにUIView表示されないのはなぜですか? また、ラベルが問題なく表示されるのはなぜですか?

アップデート

カスタム ヘッダー ビューの init メソッドを次に示します。ここでは、セグメント化されたコントロールをプログラムで (ストーリーボードではなく) 追加しようとしました。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]];
        [_segmentedControl setFrame:CGRectMake(0, 0, 100, 50)];
        [_segmentedControl addTarget:self action:@selector(segmentedControlChanged:) forControlEvents:UIControlEventValueChanged];
        [self addSubview:_segmentedControl];
    }
    return self;
}

リクエストに応じ-[UICollectionReusableView viewForSupplementaryElementOfKind:]て、メイン ビュー コントローラーのメソッドを次に示します。

- (UICollectionReusableView *)collectionView:(UICollectionView *)cv viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
    return headerView;
}
4

1 に答える 1

4

ストーリーボードの問題を再現できません。セグメント化されたコントロールをストーリーボードに直接ドラッグして追加すると(コードは不要です)、うまく機能します。プログラムで追加する別の方法については、ここでの問題は、ビューがストーリーボードから初期化されるときに (この場合のように)、initWithCoder初期化メソッドが使用されることです (初期化メソッドではありませんinitWithFrame)。したがって、そのメソッドをオーバーライドしてそこにコードを挿入すると、動作するはずです。

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if(self){
        _segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]];
        _segmentedControl.bounds = CGRectMake(0, 0, 100, 50);
        [_segmentedControl addTarget:self action:@selector(segmentedControlChanged:) forControlEvents:UIControlEventValueChanged];
        [self addSubview:_segmentedControl];
    }
    return self;
}

PSこの特定のケースには影響しませんが、次のことを行う必要があります。

GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];

それ以外の:

GalleryHeader *headerView = [cv dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];

正しい種類のビューを要求するのはコレクション ビューであるため、それを指定することに注意する必要があります。

編集:ストーリーボードからヘッダーを作成するために私が従った手順は次のとおりです。

  • コレクション ビューを選択し、[セクション ヘッダー]というラベルの付いたボックスにチェックを入れます

  • 新しく作成されたヘッダーを選択し、ID インスペクターで適切なクラスを選択します

ここに画像の説明を入力

  • ヘッダー セクションに一意の識別子を付与する

ここに画像の説明を入力

  • ストーリーボードのヘッダーにある UI 要素をドラッグします (背景色も変更しました)

ここに画像の説明を入力

  • 最後collectionView:viewForSupplementaryElementOfKind:atIndexPath:に、コレクション ビューのデータ ソース クラスにメソッドを実装します。
 -(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
          viewForSupplementaryElementOfKind:(NSString *)kind 
                                atIndexPath:(NSIndexPath *)indexPath
 {
     return [self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionViewHeader" forIndexPath:indexPath];
 }

あなたがしたことと私がしたことの違いを見つけることができるかどうか教えてください!

于 2013-06-18T14:13:09.420 に答える