web-dev-qa-db-ja.com

UITableView configureCellForDisplay:forIndexPathでのアサーションエラー:

他の同様の問題を見て、エラーがどこにあるのかわかりません。アサーションの失敗を受け取りました。

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;

}
48
Jason Taylor

セルを作成することはなく、デキューされたセルを再利用しようとします。ただし、作成したことがないため、何もありません。

- (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:は新しいものをインスタンス化できます。

106
vikingosegundo

Storyboardで識別子@"cell"を使用してプロトタイプセルを定義していない場合、デキューしようとするとアサーションエラーが発生します。

これを修正するには、プロトタイプセルにIdentifierプロパティを設定します(セルを選択し、右側のパネルでその属性を設定します)。

13
sapi

私がやった非常に愚かな間違いは

クラスコードのようなコントローラークラス名がclass TagsViewController:UIViewControllerの後にUITableViewDelegate、UITableViewDataSourceを配置しませんでした

class TagsViewController:UIViewController、UITableViewDelegate、UITableViewDataSourceが必要です

これにより、他のすべてのコードは問題ありませんでした。

7
Ourang-Zeb Khan

カスタム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;
}
0
user1802778

同じエラーが発生し、なんとか障害を見つけることができました。セグエとビュータイトルの配列がありました。

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]];

かなり些細なことですが、かなりイライラしていました!これが役に立てば幸いです。

0
Septronic