it-swarm.com.ru

Ошибка подтверждения в 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

Если вы не определили ячейку прототипа с идентификатором @"cell" в раскадровке, вы получите сообщение об ошибке при попытке удалить ее из очереди.

Это можно исправить, установив свойство Identifier в ячейке прототипа (выберите ячейку и установите этот атрибут на правой панели).

13
sapi

Я сделал очень глупую ошибку:

я не поставил UITableViewDelegate, UITableViewDataSource после имени класса контроллера, например my код класса был class TagsViewController: UIViewController

он должен иметь класс TagsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

Может быть, один из вас сталкивается из-за этого весь другой код был в порядке.

7
Ourang-Zeb Khan

Вам нужно вызвать «initWithStyle» в пользовательском TableViewCell и снова инициализировать объекты.

Пример: файл 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

У меня была такая же ошибка, и мне удалось найти ошибку. У меня был массив для segues и просмотра заголовков:

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

Довольно тривиально, но это было довольно неприятно! Надеюсь, это помогло.

0
Septronic