web-dev-qa-db-ja.com

Xcodeは識別子を持つセルをデキューできません

私の仕事は `UITableViewについてです。プロジェクトを実行するたびに、このエラーが表示されます:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell1 - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

ストーリーボードとコードで同じセル識別子を100回確認しました。コード(UITableViewControllerからのコードを無効化):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    static NSString *CellIdentifier = @"Cell1";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    return cell;
}

テーブルビューセルプロパティの画像: enter image description here

セルのUITableViewCellのサブクラスを作成して実装しました。

なぜこれが機能しないのでしょうか?

セルの識別子が何であるかを知るための方法(コード行)?

ありがとう

編集:インターフェースビルダーのスクリーンショット。

IB

編集2:customCell.hのテキスト

#import <UIKit/UIKit.h>

@interface customCell : UITableViewCell

@end

プロジェクトを実行すると新しいエラーが表示されます:

[<choixActiviteViewController 0x7591ac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Cell1.

choixActiviteViewControllerはUITableViewControllerのサブクラスであり、Choix Activite View Controllerのカスタムクラスです。

37
GoldXApp

の代わりに:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

試してください:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

これがうまくいかない場合は、以下も追加してください:

  if (cell == nil) {
    cell = [[customCell alloc] init];
}
79

問題は、Static cellsの代わりにPrototype cellsを使用していることです。 UITableViewコンテンツタイプを変更するだけです。

Prototype cells option

25
ssantos

OK、私のプロジェクトはようやく機能します。削除したものについていくつかのエラーが表示され、もう見つけられません。

次のプロパティを持つ新しい一意のUITableViewCellを作成する必要があったすべてのTableViewCellを削除しました。

クラス:customCell

スタイル:基本(ただし、カスタムでも機能します)

識別子:Cell1

サントス、アブドラシャフィク、バイロバタムにご協力いただきありがとうございます。

14
GoldXApp

静的セルを使用していると思います。あなたが意識的にそれをしているなら-あなたの.mファイルから3つのメソッドを削除するだけです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}
2
serg_ov

テーブルセルがUITableViewCellのサブクラスである場合、「基本」スタイルのセルを使用していません。属性インスペクターのスタイル設定をカスタムに変更します。

また、テーブルセルのIDインスペクターのクラスがカスタムテーブルセルサブクラスに設定されていることを確認してください。

2
bilobatum

この問題の理由は、例外から非常に明確です。

この問題の解決策の1つは、識別子のクラスを登録することです

In Swiftこれは次のように実行できます

tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier")
1
arango_86

意図的にStatic UITableViewCellsを使用している場合、通常のUITableViewポピュレーションメソッド(numberOfSectionsInTableView:, tableView:numberOfRowsInSection:, tableView:cellForRowAtIndexPath:).を実装する必要はありません。
UITableViewは、ストーリーボードで定義されたセルから自動的に入力されます。最終的にtableView:cellForRowAtIndexPath:を使用して、セル内のデータをフォーマットします。 [super tableView:cellForRowAtIndexPath:]を使用してtableViewCellを取得し、ReuseIdentifier、タグ、またはindexPathを使用して、セルをそれに付随するデータに一致させます。

customCellクラスの代わりにUITableViewCellクラスを使用してください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell1";
customCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Configure the cell...

return cell;
}
1
Oleg Sobolev

私の場合、欠落しているUITableViewCellを定義したストーリーボードはローカライズされていました。

0
Fran Pugl