50

他の同様の問題を調べたので、エラーがここにあるのかわかりません。アサーションエラーが発生しました。

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;

}
4

6 に答える 6

108

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

- (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:新しいセルをインスタンス化することもできます。

于 2013-03-09T13:57:12.353 に答える
13

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

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

于 2013-03-09T13:59:09.640 に答える
7

私がした非常にばかげた間違いは

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

クラスTagsViewController:UIViewController、UITableViewDelegate、UITableViewDataSourceが必要です

これが原因であなたの一人が直面している可能性があります。他のすべてのコードは問題ありませんでした。

于 2017-04-25T09:43:52.990 に答える
0

カスタム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;
}
于 2015-01-03T18:32:45.087 に答える
0

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

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

次に、この配列をテーブルのデータソースとして使用しました。HelpViewSegue私が受け取ったエラーは、VCをインスタンス化したときにストーリーボードで宣言されていなかったという事実が原因でした。

    vc = [mainStoryboard instantiateViewControllerWithIdentifier: [[self.menuItems objectAtIndex:1]objectAtIndex:indexPath.row]];

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

于 2015-12-22T09:11:48.267 に答える
-2

以下のコードでは@"cell"、(smallで記述されたc)記述していますが、使用する必要があります@"Cell"C大文字である必要があります)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
于 2016-04-26T21:44:51.710 に答える