web-dev-qa-db-ja.com

UICollectionViewでのiOSアサーションの失敗

エラーが出ます...

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2372/UICollectionView.m:2249

UICollectionViewを表示しようとしたとき。

それを引き起こしている線は...

static NSString *CellIdentifier = @"Cell";

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

デキューでエラーが発生しました。

他にエラーはないので、これからどこから始めればいいのかわからない。

誰かがこれに光を当てることができますか?

28
Fogmeister

ドキュメントを読んでいる(おそらくこれを最初に行ったはずです:))

とにかく、私が使用しているcollectionViewは、個別のxibファイル(ストーリーボードではなく)内にあり、ドキュメントから...

Important: You must register a class or nib file using the
registerClass:forCellWithReuseIdentifier: or
registerNib:forCellWithReuseIdentifier: method before calling this method.

ありがとう

29
Fogmeister

以下のように登録する必要があります:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"MY_CELL"];
37
Gaurav

registerNib:メソッドを使用する場合は、次のことを確認してください。

UINib *nibH = [UINib nibWithNibName:HEADER_ID bundle:nil];
[collectionView registerNib:nibH
 forSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
        withReuseIdentifier:HEADER_ID];

that [〜#〜] also [〜#〜] nibファイルで、最上位のコレクションの再利用可能なビューを選択し、属性インスペクターを使用し、確認するIdentifierは、withReuseIdentifier:パラメータに渡すのと同じ値に設定されます。

3
bshirley

私も同じ問題を抱えていました。ここに私がそれを解決した方法があります。

動く

_[self.pictureCollectionView registerNib:[UINib nibWithNibName: bundle:nil] forCellWithReuseIdentifier:reuseID]_

- (void)viewDidLoad

メソッド- (void)awakeFromNibではなく。

2
U.Jhon

私はこれを取得しましたiOS 9のみでクラッシュします(iOS 10/11は正常に動作しています)。

フローレイアウトのカスタムサブクラスはありませんでしたが、既存のものに直接headerReferenceSizeを設定しました。したがって、セクションヘッダーを有効にしたインターフェイスビルダーで、このクラッシュが発生しましたチェックマークなしですべて正常に動作しますおよびコードでサイズを設定したので、ヘッダーは正しく表示されています。

enter image description here

1
fl034

交換する

NSString *CellIdentifier = @"Cell";

static NSString *CellIdentifier = @"Cell";
0
CAMOBAP

一意のReuseIdentifiersで複数のUICollectionViewsを使用すると、このエラーがポップアップ表示されます。 ViewDidLoadで、次のように各CollectionViewのreloadIdentifierを登録します。

[_collectionView1 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView1CellIdentifier"];
[_collectionView2 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView2CellIdentifier"];

次に、「ICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath」に到達したときに、collectionView1のセルをcollectionView2のreloadIdentifierに設定しないようにします。このエラーが発生します。

---(DO N'T DO THIS:(または、collectionView2は間違った識別子を参照し、予期していた識別子を参照する前に適合をスローします)

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath];

if(collectionView != _collectionView1){
   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath];
}

cell.backgroundColor = [UIColor greenColor];
return cell;

これを行う

UICollectionViewCell *cell;

if(collectionView == _collectionView1){
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath];
}else{
   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath];
}

cell.backgroundColor = [UIColor greenColor];
return cell;
0
ColossalChris