Сбой пользовательской ячейки раскадровки iOS 5: источник данных UITableView должен возвращать ячейку - PullRequest
5 голосов
/ 10 января 2012

Это либо ошибка XCode, либо я здесь упускаю важное правило.

Обновление: - Какова вероятность того, что это странная ошибка в XCode / Storyboard?

Ситуация:

  • iOS 5, раскадровка
  • Это настройка раскадровки: http://i.imgur.com/T5WyD.png
  • Еще один скриншот полной настройки: http://i.imgur.com/1tVuz.png
  • TableViewController с пользовательской ячейкой, ячейка имеетмногоразовый идентификатор "NewCell"
  • в "cellForRowAtIndexPath" У меня в основном есть:

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewCell"]; return cell;

  • Это вызывает исключение:

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Вещи, которые я уже пробовал:

  • Я устанавливаю новый проект с нуля, TabBarController,с помощью TableViewController и пользовательской ячейки, подключенных в раскадровке, можно установить идентификатор ячейки многократного использования.Использовал тот же код, что и выше, отлично работал .Я не знаю, почему он не работал с раскадровкой выше ...

У меня такое ощущение, что это как-то связано с деревом, которое я там построил, - TabBarController, загружающимNavigationController, загружая TableViewController, предоставляя несколько элементов, при нажатии на один из которых загружается другой TableViewController, который каким-то образом не может работать с пользовательской ячейкой.

Важное замечание: - Проблема заключается вчто раскадровка должна убедиться, что: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewCell"]; никогда не вернет NIL (в отличие от раскадровки / iOS4).Но мой ноль.И, черт возьми, я не могу понять, что происходит.

Ответы [ 5 ]

2 голосов
/ 31 января 2012

Эй, у меня сегодня была эта проблема, и я выяснил несколько возможных причин. Чтобы связать UITableView как подпредставление ViewController в Story board, убедитесь, что вы выполнили эти шаги.

  1. В вашем "ViewController.h" добавьте <UITableViewDataSource> в свой список протоколов

    @ интерфейс ViewController: UIViewController <UITableViewDataSource>

    вы можете добавить <UITableViewDelegate>, но я не сделал.

  2. В вашем "ViewController.m" настройте источник данных вашего табличного представления Функции

    #pragma mark - Table view data source
    
    <pre><code>- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        // Return the number of sections.
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        // Return the number of rows in the section.
        return [yourCells count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        NewCell *cell = (NewCell *)[tableView 
                                               dequeueReusableCellWithIdentifier:@"NewCell"];
        if (cell == nil) {
            NSLog(@"Cell is NIL");
            cell = [[CustomCell alloc] 
                    initWithStyle:UITableViewCellStyleDefault 
                    reuseIdentifier:CellIdentifier];
        }
    
        return cell;
    </code>
    }
  3. В раскадровке подключите «Источник данных» UITableView и «Делегировать» ссылки на ViewController.

  4. В Storyboard присвойте ячейке-прототипу идентификатор "NewCell"

Если это будет сделано, я считаю, что это должно сработать.

Надеюсь, это поможет =)

1 голос
/ 10 января 2012

Я всегда использую пользовательские ячейки в раскадровке так:

static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
return cell;

Убедитесь, что количество строк / разделов не меньше одной.И еще одна вещь, которую нужно проверить, это то, что вы установили UITableViewController на свое имя класса в раскадровке.

0 голосов
/ 03 мая 2012

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

0 голосов
/ 10 января 2012

Чтобы решить эту проблему, добавьте следующее прямо над оператором dequeueReusableCellWithIdentifier:

static NSString *CellIdentifier = @"NewCell";

убедившись, что идентификатор соответствует ячейке прототипа в раскадровке

0 голосов
/ 10 января 2012
  • Вы дважды проверили идентификатор прототипа ячейки "NewCell"?
  • Ваши настройки как Tabbar-> navigationcontroller-> tableview в порядке. я Я использую этот макет все время.
  • проверьте также, что в этом
    нет никаких бесполезных атрибутов времени выполнения ViewController / TableView / клетка.
  • ваш прототип выглядит немного странно - вы добавили UIB-кнопку в ячейку в качестве подпредставления? почему?
...