以下のコードの何が問題になっていますか
-(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>)'
テーブルビューのデリゲートとデータソースを設定しました
あなたのエラーは、cellForRowAtIndexPath
が何らかの理由でnil
を返していることを示唆していますが、再利用可能なセルのデキューに失敗しているためだと推測しています。これを確認したい場合は、現在のデキュー呼び出しの後にブレークポイントを設定するだけです。cell
がnil
に設定されていることを期待しています。
プロトタイプセルを作成する最新のXcodeテンプレートを使用している場合は、おそらくこれを代わりに使用する必要があります。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
Xcodeテンプレートを使用していない場合は、とにかくそのコード行を使用してから、次のように独自の再利用識別子を登録します。
[self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];
問題が解決するはずです。 Swiftユーザー向けにこれを詳細に書きました。
Swift 3を使用すると、UITableViewDataSourceおよびUITableViewDelegateプロトコルをViewController宣言に追加するのを忘れたときにこのエラーが発生しました。
クラスDataViewController:UIViewController、ITableViewDataSource、ITableViewDelegate
それらを追加すると問題が修正されました。
セルに識別子を指定する必要があります。 「セル」は、識別子フィールドのセルの属性インスペクターのように、セルの識別子に与えます。エラーを再現しましたが、これはセルに識別子を指定していないことが原因です。
私の場合、UITableviewのUITableViewDataSource、UITableViewDelegateを宣言するのを忘れていました。
私は同じ問題を抱えていましたが、それはUITableViewDataSourceとUITableViewDelegateプロトコルを実装するのを忘れたためです
継承されたクラスの後にクラス宣言に追加するだけです
コードでUITableViewDataSourceおよびUITableViewDelegateメソッドを使用したため、xcodeはそれについて警告する必要があります。
追加されたUITableViewDataSourceが追加されたかどうかを確認します。私はこれを逃したので、そのアプリはクラッシュしていました
UITableViewDelegateおよびUITableViewDataSourceプロトコルの実装を忘れていないことを確認してください。
class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
また、以下のコードを試してください
- (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;
}
私の場合、動的プロトタイプから静的セルに変更するのを忘れていました。インターフェースビルダーでこの部分を確認してください
「cellForRowAt」メソッドをオーバーライドする必要があります。しなかった場合は注意してください
おそらく、プロトタイプセルのメインストーリーボードで指定したのと同じ識別子を使用していないのでしょう。大文字小文字の名前も教えて、正しい識別子を使用していることを確認してください。
がんばろう:)
Nibをロードしていない場合は、まずviewDidLoadでNibを登録する必要があります。
[self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];
他の投稿で提案された手順を実行し、私のセルがnilであるかどうかを確認した後、私の問題は解決されず、チェックしたときに私のセルはnot nilとして表示されました。ただし、この便利なコードスニペットをそこに追加することで問題は解決したので、キャッチしていなかった時点でゼロだったに違いありません。
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
UITableViewとは別にtableViewCellを使用する場合は、NIBを自分で登録する必要があります。 NIBが登録されていない場合、「データソースからセルを取得できませんでした」エラーが発生する場合があります。エラーの説明から、私は常に把握するのが難しいことがわかりました、何が間違っています。
このエラーは、登録することで簡単に解決できます。
[self registerNib:[customerButtonTableViewCell class]
forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];
移行時に注意する
誰かが古い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"