他の同様の問題を見て、エラーがどこにあるのかわかりません。アサーションの失敗を受け取りました。
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:
簡単なことだと思いますが、誰かが助けてくれることを願っています。
以下は私のコードです:
#import "StockMarketViewController.h"
@interface StockMarketViewController ()
@end
@implementation StockMarketViewController
@synthesize ShareNameText, ShareValueText, AmountText;
@synthesize shares, shareValues;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
return [shares count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];
[[cell textLabel]setText:currentValue];
return cell;
}
セルを作成することはなく、デキューされたセルを再利用しようとします。ただし、作成したことがないため、何もありません。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
static NSString *cellIdentifier = @"cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];
[[cell textLabel]setText:currentValue];
return cell;
}
または試してみてください(iOS 6以降のみ)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
static NSString *cellIdentifier = @"cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];
[[cell textLabel]setText:currentValue];
return cell;
}
uITableView.hから
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier
forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
-dequeueReusableCellWithIdentifier:
は、セルが返された場合、常にチェックが必要です。-dequeueReusableCellWithIdentifier:forIndexPath:
は新しいものをインスタンス化できます。
Storyboardで識別子@"cell"
を使用してプロトタイプセルを定義していない場合、デキューしようとするとアサーションエラーが発生します。
これを修正するには、プロトタイプセルにIdentifier
プロパティを設定します(セルを選択し、右側のパネルでその属性を設定します)。
私がやった非常に愚かな間違いは
クラスコードのようなコントローラークラス名がclass TagsViewController:UIViewControllerの後にUITableViewDelegate、UITableViewDataSourceを配置しませんでした
class TagsViewController:UIViewController、UITableViewDelegate、UITableViewDataSourceが必要です
これにより、他のすべてのコードは問題ありませんでした。
カスタムTableViewCellで「initWithStyle」を呼び出して、オブジェクトを再度初期化する必要があります。
例:ProductTableViewCell.mファイル
@implementation ProductTableViewCell
- (void)awakeFromNib {
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
{
self.selectionStyle = UITableViewCellSelectionStyleNone;
_titleLabel = [[UILabel alloc] initWithFrame:(CGRectMake(70, 0, 320, 60))];
[self.contentView addSubview:_titleLabel];
}
return self;
}
メイン実装ファイル内
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
ProductTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"productTableViewCell"];
NSDictionary *dic = nil;
if (tableView == self.searchDisplayController.searchResultsTableView) {
dic = [_filteredArray objectAtIndex:indexPath.row];
} else {
dic = [_originalArray objectAtIndex:indexPath.row];
}
cell.titleLabel.text = [dic objectForKey: @"title"];
return cell;
}
同じエラーが発生し、なんとか障害を見つけることができました。セグエとビュータイトルの配列がありました。
NSArray *MMTitles= [NSArray arrayWithObjects:@"MainMenu",@"viewIt",@"viewNots",@"MyProfile",@"Settings",@"Instructions",@"Help", nil];
NSArray *MMSegues=[NSArray arrayWithObjects:@"MainMenu",@"MyProfileSegue",@"viewNotSegue",@"MyProfileSegue",@"SettingsTableViewSegue",@"InstructionsViewSegue",@"HelpViewSegue", nil];
self.menuItems = [[NSArray alloc]initWithObjects:MMTitles,MMSegues, nil];
次に、この配列をテーブルのデータソースとして使用しました。私が受け取っていたエラーは、VCをインスタンス化したときにストーリーボードでHelpViewSegue
が実際に宣言されていなかったためです。
vc = [mainStoryboard instantiateViewControllerWithIdentifier: [[self.menuItems objectAtIndex:1]objectAtIndex:indexPath.row]];
かなり些細なことですが、かなりイライラしていました!これが役に立てば幸いです。