0

UICollectionviewをホストするストーリーボードがあり、コレクションビューコントローラーで実装します

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
              cellForItemAtIndexPath:(NSIndexPath *)indexPath
 {
   itemViewCell *itemCell =
   [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier
                                         forIndexPath:indexPath];

   return itemCell;
 }

しかし、dequeueReusableCellWithReuseIdentifier では、アプリは次の例外をスローします。

 [__NSCFConstantString initWithFrame:]: unrecognized selector sent to instance 0x7443c60

したがって、私の最初の傾向は、作成しているカスタムセルを見て、そのメソッドの実装があることを確認することです。実際にそうしています

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       self.backgroundColor = [UIColor whiteColor];
    }
    return self;
} 

そしてもちろん、そのセルをviewdidloadに登録しています

 [super viewDidLoad];   
 [self.collectionView registerClass:[CellIdentifier class]
       forCellWithReuseIdentifier:CellIdentifier];

しかし、私は initWithFrame メソッドにブレークポイントを設定し、決してホットしないので、これは関連しているとは思いません。私は何を間違っていますか。

4

1 に答える 1

3

ドキュメントによると:

このメソッドは、既存のセルが利用可能な場合はそれをデキューするか、以前に登録したクラスまたは nib ファイルに基づいて新しいセルを作成します。

そして続く:

重要: このメソッドを呼び出す前に、registerClass:forCellWithReuseIdentifier: または registerNib:forCellWithReuseIdentifier: メソッドを使用して、クラスまたは nib ファイルを登録する必要があります。

dequeueReusableCellWithReuseIdentifier: forIndexPath:オブジェクトを作成する必要があり、そのために上記のメソッドが必要な場合があるため、これらのメソッドのいずれかを実装する必要があります。作成したのに表示しなかった可能性があります。それらのいずれかを実装した場合、コードを表示できますか?

アップデート:

あなたviewDidLoadとあなたが得ているエラーメッセージに基づいてCellIdentifierNSString. 呼び出し[CellIdentifier class]ているときは、セルではなく文字列を使用クラスとして登録しています。使用しているクラスをここに配置する必要があります。実装に基づいて、を使用するよう[itemViewCell class]です。

ご存知のように、クラスは常に大文字にする必要があります。したがって、itemViewCellが実際のクラスである場合は、それを変更する必要がItemViewCellあり、プロパティと変数の名前は小文字にする必要があります (そうcellIdentifervs CellIdentifier)。

于 2013-06-26T16:30:05.487 に答える