web-dev-qa-db-ja.com

データソースからセルを取得できませんでした

以下のコードの何が問題になっていますか

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

    NSString *CellIdentifier  = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    cell.textLabel.text = @"hello";

    return cell;
}

そして

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

しかし、私はdataSourceからセルを取得できませんでしたを取得しています

全体の例外は

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7ffe0b092800; frame = (0 97; 414 590); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ffe0acf3b10>; layer = <CALayer: 0x7ffe0aceb6e0>; contentOffset: {0, 0}; contentSize: {414, 88}>) failed to obtain a cell from its dataSource (<AllContactsViewController: 0x7ffe0ace60f0>)'

テーブルビューのデリゲートとデータソースを設定しました

61
Rishab

あなたのエラーは、cellForRowAtIndexPathが何らかの理由でnilを返していることを示唆していますが、再利用可能なセルのデキューに失敗しているためだと推測しています。これを確認したい場合は、現在のデキュー呼び出しの後にブレークポイントを設定するだけです。cellnilに設定されていることを期待しています。

プロトタイプセルを作成する最新のXcodeテンプレートを使用している場合は、おそらくこれを代わりに使用する必要があります。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

Xcodeテンプレートを使用していない場合は、とにかくそのコード行を使用してから、次のように独自の再利用識別子を登録します。

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

問題が解決するはずです。 Swiftユーザー向けにこれを詳細に書きました。

75
TwoStraws

Swift 3を使用すると、UITableViewDataSourceおよびUITableViewDelegateプロトコルをViewController宣言に追加するのを忘れたときにこのエラーが発生しました。

クラスDataViewController:UIViewController、ITableViewDataSourceITableViewDelegate

それらを追加すると問題が修正されました。

148
David Reidy

Swift 3.0

UITableViewDelegateUITableViewDataSourceを追加するだけです。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

下の画像は参考用です。

enter image description here

43
Vivek

セルに識別子を指定する必要があります。 「セル」は、識別子フィールドのセルの属性インスペクターのように、セルの識別子に与えます。エラーを再現しましたが、これはセルに識別子を指定していないことが原因です。

私の場合、UITableviewのUITableViewDataSource、UITableViewDelegateを宣言するのを忘れていました。

2
prakash singh

私は同じ問題を抱えていましたが、それはUITableViewDataSourceとUITableViewDelegateプロトコルを実装するのを忘れたためです

継承されたクラスの後にクラス宣言に追加するだけです

コードでUITableViewDataSourceおよびUITableViewDelegateメソッドを使用したため、xcodeはそれについて警告する必要があります。

2

追加されたUITableViewDataSourceが追加されたかどうかを確認します。私はこれを逃したので、そのアプリはクラッシュしていました

1
Urvish Modi

UITableViewDelegateおよびUITableViewDataSourceプロトコルの実装を忘れていないことを確認してください。

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

1
Mohsin Qureshi

また、以下のコードを試してください

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    static NSString *CellIdentifier = @"Cell";
    // Reuse and create cell    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // Update cell data contents
    cell.textLabel.text = @"Your text here";
    cell.detailTextLabel.text=@"Your detailed text label";

    return cell;
}
1
user3182143

私の場合、動的プロトタイプから静的セルに変更するのを忘れていました。インターフェースビルダーでこの部分を確認してください

1
sarah

「cellForRowAt」メソッドをオーバーライドする必要があります。しなかった場合は注意してください

0
oskarko

おそらく、プロトタイプセルのメインストーリーボードで指定したのと同じ識別子を使用していないのでしょう。大文字小文字の名前も教えて、正しい識別子を使用していることを確認してください。

がんばろう:)

0

Nibをロードしていない場合は、まずviewDidLoadでNibを登録する必要があります。

 [self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];
0
GSK

他の投稿で提案された手順を実行し、私のセルがnilであるかどうかを確認した後、私の問題は解決されず、チェックしたときに私のセルはnot nilとして表示されました。ただし、この便利なコードスニペットをそこに追加することで問題は解決したので、キャッチしていなかった時点でゼロだったに違いありません。

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
0
jungledev

UITableViewとは別にtableViewCellを使用する場合は、NIBを自分で登録する必要があります。 NIBが登録されていない場合、「データソースからセルを取得できませんでした」エラーが発生する場合があります。エラーの説明から、私は常に把握するのが難しいことがわかりました、何が間違っています。

このエラーは、登録することで簡単に解決できます。

 [self registerNib:[customerButtonTableViewCell class]
     forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];
0
Vincent

移行時に注意する
誰かが古いSwiftバージョンから新しいバージョンにコードを移行している場合、意図せずにUITableViewDataSource関数の構文を新しいSwiftに変更しないと、これが発生する可能性があります構文。
残念ながら、コンパイラは文句を言いません。
この問題に直面したのは、コードをSwift 2からSwift 4.に移行していたときです。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell   

Swift 4バージョンへ:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  

そして、私はエラーを得ました:

"Failed to obtain a cell from its DataSource"
0
Mehdi