10

ヘッダーでカスタムUICollectionReusableView(独自のクラスと XIB を持つ)を使用しようとしていますUICollectionView。しかし、ヘッダーの代わりにデータを取得した後、何もありません。

私の手順:

  1. viewDidLoadにクラスを登録する:

     [self.collectionView registerClass:[CollectionViewHeader class] 
      forSupplementaryViewOfKind: UICollectionElementKindSectionHeader 
      withReuseIdentifier:@"HeaderView"];
    
  2. 表示しようとしています:

    - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
    {
    UICollectionReusableView *reusableView = nil;
    
    if (kind == UICollectionElementKindSectionHeader) {
        CollectionViewHeader *collectionHeader = [self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
    
        NSInteger section = [indexPath section];
        id <NSFetchedResultsSectionInfo> sectionInfo = [fetchRecipes sections][section];
        collectionHeader.headerLabel.text = @"bla-bla-bla";
    
        reusableView = collectionHeader;
    }
    
    return reusableView;
    }
    

誰が何が悪いのか教えてもらえますか? ) アドバイスありがとうございます

4

7 に答える 7

14

xibにラベルを追加していると思います。したがって、registerClass:の代わりに、ヘッダー ビューに対してregisterNib:を使用する必要があります

于 2013-05-16T06:00:34.367 に答える
10
  1. viewDidLoad セクションにヘッダー nib/xib を登録します。

    [self.collectionView registerNib:  [UINib nibWithNibName:@"headerCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"headerCell"]; 
    
  2. カスタム補足ビュー セルを作成します。

    - (headerCollectionViewCell *)collectionView:(UICollectionView *)collectionViews viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
    {
        UICollectionReusableView *reusableView = nil;
    
        if (kind == UICollectionElementKindSectionHeader) {
    
            UINib *nib = [UINib nibWithNibName:@"headerCollectionViewCell" bundle:nil];
    
            [collectionViews registerNib:nib forCellWithReuseIdentifier:@"headerCell"];
    
            headerCollectionViewCell *collectionHeader = [collectionViews dequeueReusableCellWithReuseIdentifier:@"headerCell" forIndexPath:indexPath];
            collectionHeader.titleLabel.text = @"What";
    
            reusableView = collectionHeader;
       }
    
       return reusableView;
    }
    
于 2013-10-24T16:12:22.807 に答える
1

実際にはいくつかの理由が考えられます:

  1. (最も一般的な) ストーリーボードに u'rsuplementaryViewを追加してから、クラスを登録しようとすると

    [self.stickyCollectionView registerClass:[<CLASSFORSUPPLEMENTARYVIEWW> class]
              forSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                     withReuseIdentifier:NSStringFromClass([<CLASSFORSUPPLEMENTARYVIEWW> class])];
    

u は取得suplementaryViewしますが、u create (標準のもの) ではありません - u には obj が表示されますが、実際にはこれはプレースホルダーのようになります。

例:

ここに画像の説明を入力

ここで、obj が作成されたことがわかりますが、アウトレットは nil です (この単純なケースでは、アウトレットは 1 つだけです - _monthNameLabel)。

  1. この問題も数回見ます

ObjdataSourse/delegate を処理するために個別に作成しcollectionView、それに参照アウトレットを追加し、initメソッドでクラスをアウトレットに登録しようとすると (別の nib ファイルで作成されたビューを想定)、前と同じ結果が得られますが、別の理由 - あなたのアウトレットはここではゼロです:

ここに画像の説明を入力

解決策として、たとえば次のようにカスタム セッターを使用できます。

#pragma mark - CustomAccessors

- (void)setcCollectionView:(UICollectionView *)collectionView
{
    _collectionView = collectionView;

    [self.stickyCollectionView registerNib:...];
}
  1. @Anil Vargheseの提案

registerClass代わりに使用できますregisterNib

于 2016-07-21T10:13:20.937 に答える