web-dev-qa-db-ja.com

エラーは、種類UICollectionElementKindCellのビューをデキューできませんでした

コレクションビューで最初に思い切って、このエラーに遭遇しています:

NS

以下に示すように、コードは非常に単純です。私の人生では、私が行方不明になっていることを理解することはできません。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor]; 
return cell;
}

Collection View Controllerはnibを使用して作成され、デリゲートとデータソースは両方ともファイルの所有者に設定されています。

View Controllerのヘッダーファイルも非常に基本的です。

@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@end
26
Anti-Dentite

Dequeueメソッドの ICollectionViewドキュメント から:

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

34
jrturton

DequeueReusableCellWithReuseIdentifierの引数とUICollectionViewCellのプロパティの間で同じ識別子を使用する必要があります。

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

identifier

25
Kohei Mikami

@jrtutonが書いたものを補完する...必要なものは:

1)nibファイルを登録して、識別子と「接続」します。

//MyCollectionView.m
- (void) awakeFromNib{
 [self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil]   forCellWithReuseIdentifier: @"MyCellIdentifier"];
}

2)識別子を使用して、ペン先からカスタムセルを読み込みます。

//MyCollectionView.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath  *)indexPath {
    MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath];
}

3)常に静的なNSString *を使用して、アプリで同じ識別子が再び使用されないようにします。

6
orafaelreis

私はすべてが100%正しく行われました。しかし、何らかの理由で私は1時間同じエラーを受け取りました、そして私がやったことは:

  1. 絵コンテに行く
  2. プロトタイプセルを選択します(私の場合)
  3. iDインスペクターからクラス名をクリアしてから、書き換えます
  4. 属性インスペクターの識別子名を書き換えます

単純に、このステップを以前に修正していても、やり直しました。そのようなxcodeは特定のナノ秒で何かを見逃しています!

3
Omar N Shamali

Swift4.

UITableViewCellxibのときはいつでも、UITableViewに登録する必要があります。

override func viewDidLoad(){
    super.viewDidLoad()

    self.yourtableview.register(UINib(nibName: "yourCellXIBname", bundle: Bundle.main), forCellReuseIdentifier: "YourCellReUseIdentifier")
   }
1
Rakesh Patel

Swift 5

1)HEADERの正しい両端キューがあることを確認します。通常のセルには通常を使用している可能性があります。

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath)
        return header
    }

2)登録を確認します(ViewDidLoad)

collectionView.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerId)
1
Tech Luthiers

ストーリーボードで正しい再利用可能な識別子を指定する必要があります。これは、collectionViewCellの登録時にコードで指定します。

これがコードです。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC
    return cell            
}
0
Ayush Dixit

Xibの代わりにstoryboardを使用している場合、ここにいくつかの手順があります。

  1. セルの正しい識別子を必ず入力してください。

Prototype cellAttribute panel

  1. ColletionViewDelegateで。

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCellName", for: indexPath)as! YourCellName
        return cell            
    }
    
  2. それでおしまい。また、do n'tを追加したいregisterClass:forCellWithReuseIdentifier:要素nilエラーが発生します。

0
Allen

私はこれが古いものであることを知っていますが、私は同じ問題を経験しており、それが私のために修正したものを共有したかったです。

私の場合、グローバル識別子を宣言しました

let identifier = "CollectionViewCell"

そして、使用する直前にselfを使用する必要がありました。

collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell

これが誰かを助けることを願っています:)

0
Jacob.B

私にとってこれを修正したのは(ほぼ)Omarの答えと同じでしたが、新しいUICollectionViewCellカスタムクラスを作成し、Cell Reuse Indentifierにアプリケーションの他の場所で使用した名前とは異なる新しい名前を付けました。その後すぐに機能しました。

0
ciara staggs