web-dev-qa-db-ja.com

識別子Cellを持つセルをデキューできません-識別子のnibまたはクラスを登録するか、ストーリーボードでプロトタイプセルを接続する必要がありますか?

ユーザーのライブラリ内の曲のリストのTableViewを表示しようとしています。 this tutoria lのコードを使用しました(これはストーリーボードを使用しますが、UITableViewのサブクラスのみで別の方法で試してみたいと思います)。

エラーが表示されます:

*** Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2903.23/UITableView.m:5261
2014-05-07 20:28:55.722 Music App[9629:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

エラーThread 1: SIGABRT行:

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

これは私のコードです:

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
    NSArray *songs = [songsQuery items];

    return [songs count];
}


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

    // Configure the cell...

    MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
    NSArray *songs = [songsQuery items];

    MPMediaItem *rowItem = [songs objectAtIndex:indexPath.row];

    cell.textLabel.text = [rowItem valueForProperty:MPMediaItemPropertyTitle];
    cell.detailTextLabel.text = [rowItem valueForProperty:MPMediaItemPropertyArtist];

    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Table-view-background.png"]];
    cell.textLabel.textColor = [UIColor colorWithRed:0.278 green:0.278 blue:0.278 alpha:1.0];

    cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Table-view-selected-background.png"]];

    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];

    return cell;
}

アプリがロードされて正常に動作し、MacのiPhoneシミュレーターで実行すると空のテーブルが表示されます。 iPhoneで実行すると、このエラーが発生します。

どんな助けも感謝します!

17
user3127576

プログラムでテーブルビューを作成し、デフォルトのUITableViewCellを使用している場合は、クラスを登録する必要があります(viewDidLoadが適切な場所です)。コードでセル(およびそのサブビュー)を作成する場合にのみ、カスタムクラスに対してこれを行うこともできます(registerNib:forCellWithReuseIdentifierを使用:セルがxibファイルで作成される場合)。

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

ただし、これにより、detailTextLabelのない「基本」テーブルビューセルのみが提供されます。そのタイプのセルを取得するには、より短いdequeueメソッドdequeueReusableCellWithIdentifier:を使用する必要があります。このメソッドは、その識別子を持つセルが見つからない場合に例外をスローせず、if(cell == nil)句を使用してセルを作成し、

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

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
    //Configure cell
   return cell;
}
33
rdelmar

セルにカスタムクラスを使用している場合は、テーブルビューで使用するセルのnibが既に登録されていることを確認してください。次のように:

[self.yourTableViewName registerNib:[UINib nibWithNibName:@"YourNibName" bundle:nil]
         forCellWithReuseIdentifier:@"YourIdentifierForCell"];

それとは別に、カスタムUITableViewCellサブクラスに適切な再利用識別子があることを確認してください。

カスタムクラスを使用していない場合は、Apple Docs:

tableView:cellForRowAtIndexPath:メソッドの実装におけるデータソースは、Table Viewが行を描画するために使用できる構成済みセルオブジェクトを返します。パフォーマンス上の理由から、データソースは可能な限りセルを再利用しようとします。まず、dequeueReusableCellWithIdentifier:を送信して、特定の再利用可能なセルオブジェクトをテーブルビューに要求します。

詳細については、次のリンクにアクセスしてください: プログラムによるテーブルビューの作成

これがお役に立てば幸いです!

19
Barbara R

クラッシュの理由は、使用していることです

[tableView dequeueReusableCellWithIdentifier: forIndexPath:]

セルに使用するセルまたはnibファイルを指定しない限り、クラッシュが発生します。

クラッシュを回避するには、代わりに次のコード行を使用します

[tableView dequeueReusableCellWithIdentifier:];

使用できるセルがない場合、このコード行はnilを返します。

ドキュメント内で here にある違いを確認できます。

また、Q&Aには良い答えがあります こちら

11
Fernando

私はこれがこの質問に答えるのに少し遅れていることを知っていますが、ここに私が欠けていたものがあります。

私がやっていた:

let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)

しかし、私はこれを行う必要があります:

let cell = self.tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)

通知:self.はtableViewの隣に追加されました。これで24時間節約できることを願っています。

3
Jsonras

デフォルトのUITableViewCellを使用する(カスタマイズしない)[tableView dequeueReusableCellWithIdentifier:forIndexPath:]の場合、registerClassまたはregisterNib;を使用する必要があります。 (dequeReusableCellIdentifier:forIndexPathはnilセルを返しません。セルがない場合、デフォルトのUITableViewCellStyelDefaultで新しいtableViewCellを自動的に作成します!)

それ以外の場合は、registerClassまたはregisterNibなしで[tableView dequeueReusableCellWithIdentifier]を使用できます。

2
Rachel

StoryBoardを使用している場合は、tableviewcontroller-> table-> Cellを選択し、属性インスペクターでそのCellに「識別子」を指定します。 'cellforrowatindexpath'メソッドで同じ 'Identifier'を使用していることを確認してください。

0
Kazmi