Подтвердить что ты не робот

Не удалось получить ячейку из своего DataSource

Что не так с приведенным ниже кодом

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *CellIdentifier  = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    cell.textLabel.text = @"hello";

    return cell;
}

И

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

но я получаю не удалось получить ячейку из своего источника данных

Все исключение составляет

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7ffe0b092800; frame = (0 97; 414 590); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ffe0acf3b10>; layer = <CALayer: 0x7ffe0aceb6e0>; contentOffset: {0, 0}; contentSize: {414, 88}>) failed to obtain a cell from its dataSource (<AllContactsViewController: 0x7ffe0ace60f0>)'

Я установил делегат и источник данных для представления таблицы

4b9b3361

Ответ 1

Ваша ошибка говорит о том, что cellForRowAtIndexPath по какой-то причине возвращает nil, и я предполагаю, что вы не удаляете повторно используемую ячейку. Если вы хотите подтвердить это, просто установите точку останова после вашего текущего вызова по дефолту: я ожидаю, что вы найдете cell для параметра nil.

Если вы используете современные шаблоны Xcode, в которых вы создаете ячейку прототипа, созданную для вас, вероятно, вы должны использовать это вместо:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

Если вы не используете шаблон Xcode, используйте эту строку кода, а затем зарегистрируйте свой собственный идентификатор повторного использования следующим образом:

[self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];

Все хорошо, что должно решить проблему. Я написал это более подробно для пользователей Swift.

Ответ 2

Использование Swift 3 Я столкнулся с этой ошибкой, когда забыл добавить UITableViewDataSource и UITableViewDelegate протоколы в объявление ViewController.

класс DataViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Добавление их исправило проблему.

Ответ 3

Swift 3.0

Вам просто нужно добавить UITableViewDelegate и UITableViewDataSource

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

Ниже изображение предназначено только для справки.

введите описание изображения здесь

Ответ 4

Вы должны указать ячейке идентификатор. "Ячейка" присваивает идентификатор ячейки, как в инспекторе атрибутов ячейки в поле идентификатора. Я повторно произвел вашу ошибку, и это связано с тем, что вы не указали идентификатор вашей ячейки.

Ответ 5

У меня была такая же проблема, и это было потому, что я забыл реализовать UITableViewDataSource и UITableViewDelegate протоколы

просто добавьте их в объявление класса после унаследованного класса

xcode должен предупредить меня об этом, потому что я использовал UITableViewDataSource и UITableViewDelegate методы в своем коде

Ответ 6

Также попробуйте приведенный ниже код

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    static NSString *CellIdentifier = @"Cell";
    // Reuse and create cell    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // Update cell data contents
    cell.textLabel.text = @"Your text here";
    [email protected]"Your detailed text label";

    return cell;
}

Ответ 7

В моем случае я забыл объявить UITableViewDataSource, UITableViewDelegate для UITableview.

Ответ 8

Вероятно, вы не используете тот же Идентификатор, который вы указали в основной доске для прототипа ячейки. Попробуйте также указать имя для нижнего регистра верхнего регистра, чтобы убедиться, что вы используете правильный идентификатор.

Удачи:)

Ответ 9

Если вы не загружаете Nib, вам необходимо сначала зарегистрировать Nib в viewDidLoad.

 [self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];

Ответ 10

При использовании tableViewCell помимо UITableView вам необходимо зарегистрироваться сам НИБ. Когда NIB не зарегистрирован, может произойти ошибка "Не удалось получить ячейку из своего источника данных". Из описания ошибки мне всегда трудно понять, что не так.

Эта ошибка может быть легко решена путем регистрации:

 [self registerNib:[customerButtonTableViewCell class]
     forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];

Ответ 11

После выполнения шагов, предложенных в других сообщениях, и проверки того, была ли моя ячейка нулевой, моя проблема не была решена, и моя ячейка не показывалась как ноль, когда я проверил ее. Однако добавление этого удобного фрагмента кода там устранило проблему, поэтому в какой-то момент, когда я ее не поймал, она была нулевой.

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}

Ответ 12

Убедитесь, что добавлен UITableViewDataSource. Я пропустил это, так что приложение сбой