web-dev-qa-db-ja.com

UICollectionViewにIBのUICollectionViewCellが含まれていません

UICollectionViewをIBの.nibファイルに追加しようとしています。私はいくつかのチュートリアルを実行しましたが、問題はありませんでした。

既存のアプリで、コレクションビューをIBのビューにドラッグしてからオブジェクトを展開すると、CollectionViewフローレイアウトは表示されますが、コレクションビューセルはありません。また、セルをコレクションビューにドラッグアンドドロップすることもできません。また、コレクションビューの表示も異なり、通常の白いボックスの代わりにセルのグリッドの画像が表示されます。

Nibを使用して新しいViewControllerを作成しようとしましたが、collectionViewを追加しても同じ結果になります。

このアプリはiOS4.2を対象としていましたが、展開対象をiOS6に変更しました。

新しく作成されたプロジェクトでは、この動作は発生しません。

21
Alpinista

なぜそれが機能しないのかはわかりませんが、私にとっては、このブログ投稿のサブクラスアプローチで問題が解決しました。

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

ここに短い要約があります:

  • uICollectionViewCellを拡張する新しいクラスMyViewCellを作成し、必要に応じてプロパティ、アクション、アウトレット、およびメソッドを作成します。

@interface MyViewCell : UICollectionViewCell

  • コレクションビューセルをルートオブジェクトとしてビュー(xibファイル)を作成します(デフォルトで作成されたオブジェクトを削除します)。
  • 属性で、このコレクションビューセルのカスタムクラスを(デフォルトのUICollectionViewCellではなく)拡張クラスMyViewCellに設定します。
  • コレクションの再利用可能なビューの下の属性で、識別子を定義します。 myCell、後で通話を登録するためにこれが必要になります。
  • カスタムクラスに戻り、initthWithFrameメソッドを変更して、作成したビューをロードして使用します。

    - (id)initWithFrame:(CGRect)frame 
    { 
       self = [super initWithFrame:frame]; 
       if (self) 
       { 
         // Initialization code 
         NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil];
    
         if ([arrayOfViews count] < 1) { return nil; }
    
         if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; }
    
         self = [arrayOfViews objectAtIndex:0];
       }
       return self;
    }
    
  • 次に、collectionViewで使用するこのクラスを登録できます。

[self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"myCell"];

9
DELUXEnized

質問されてからしばらく経ちますが、最近同じ問題に直面しました。

最終的に、私は答えを見つけました ここ

要するに:

  • .xibファイルを使用している場合、UICollectionViewCellをUICollectionViewにドラッグアンドドロップすることはできません。これはストーリーボードでのみ可能です。
  • 回避策は、カスタムセル用の.xibファイルを作成し、以下を使用してセルを手動で登録することです。

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

8
Performat

別のnibファイルでセルビューを定義します。ビューは、タイプUICollectionViewCellまたはサブクラスである必要があります。

次に、ペン先をコレクションビューに登録する必要があります。

- (void)viewDidLoad
{
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"];
}
3
hpique

これらの答えは正しいですが、問題の根本的な原因は非常に微妙であり、Appleはログのエラーメッセージを更新する必要があります。次のように表示されます:

Unknown class MyViewCell in Interface Builder file.

実際の意味は、ソースコードに@ implementation宣言がないか、.mファイルがターゲットに追加されていないことです。したがって、コードをチェックして、次のことを確認してください。

@implementation MyViewCell

@end

これはUITableViewCellとUICollectionViewCellの両方に当てはまります。

一般的なケースについては、 https://stackoverflow.com/a/12755891/539149 でさらに問題について説明します。

興味深いのは、@ implementationがない場合は、次のように呼び出すことです。

[self.myCollectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"MyViewCell"];

次のように表示されます。

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_MyViewCell", referenced from:
      objc-class-ref in MyViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

したがって、Appleは問題を認識しており、コンパイル中に問題を検出していません。カスタムセルを個別のペン先に配置したり、registerClass:forCellWithReuseIdentifier:を呼び出したりしないことをお勧めします。カスタムを保存する方がはるかにクリーンです。 InterfaceBuilderのコンテナUICollectionViewまたはUITableView内のセル。

0
Zack Morris