ユーザーのライブラリ内の曲のリストの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で実行すると、このエラーが発生します。
どんな助けも感謝します!
プログラムでテーブルビューを作成し、デフォルトの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;
}
セルにカスタムクラスを使用している場合は、テーブルビューで使用するセルのnibが既に登録されていることを確認してください。次のように:
[self.yourTableViewName registerNib:[UINib nibWithNibName:@"YourNibName" bundle:nil]
forCellWithReuseIdentifier:@"YourIdentifierForCell"];
それとは別に、カスタムUITableViewCellサブクラスに適切な再利用識別子があることを確認してください。
カスタムクラスを使用していない場合は、Apple Docs:
tableView:cellForRowAtIndexPath:メソッドの実装におけるデータソースは、Table Viewが行を描画するために使用できる構成済みセルオブジェクトを返します。パフォーマンス上の理由から、データソースは可能な限りセルを再利用しようとします。まず、dequeueReusableCellWithIdentifier:を送信して、特定の再利用可能なセルオブジェクトをテーブルビューに要求します。
詳細については、次のリンクにアクセスしてください: プログラムによるテーブルビューの作成 。
これがお役に立てば幸いです!
私はこれがこの質問に答えるのに少し遅れていることを知っていますが、ここに私が欠けていたものがあります。
私がやっていた:
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
しかし、私はこれを行う必要があります:
let cell = self.tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
通知:self.
はtableViewの隣に追加されました。これで24時間節約できることを願っています。
デフォルトのUITableViewCellを使用する(カスタマイズしない)[tableView dequeueReusableCellWithIdentifier:forIndexPath:]の場合、registerClassまたはregisterNib;を使用する必要があります。 (dequeReusableCellIdentifier:forIndexPathはnilセルを返しません。セルがない場合、デフォルトのUITableViewCellStyelDefaultで新しいtableViewCellを自動的に作成します!)
それ以外の場合は、registerClassまたはregisterNibなしで[tableView dequeueReusableCellWithIdentifier]を使用できます。
StoryBoardを使用している場合は、tableviewcontroller-> table-> Cellを選択し、属性インスペクターでそのCellに「識別子」を指定します。 'cellforrowatindexpath'メソッドで同じ 'Identifier'を使用していることを確認してください。