Попытка отладки ошибки: *** Ошибка подтверждения в - [UITableView _createPreparedCellForGlobalRow: withIndexPath:] - PullRequest
17 голосов
/ 02 октября 2011

У меня есть простой UITableviewController, который раньше работал нормально, а теперь что-то сломалось .. Он представляет собой простую форму, которая позволяет мне добавить простую запись из 3 полей в управляемый объект с основными данными.

Когда я добавляю запись, она должна вернуться в таблицу и отобразить ее содержимое. Я вижу, что он записывает запись в базу данных, но таблица пуста, и появляется ошибка ниже. Я могу продолжать добавлять записи, нажимая кнопку «Добавить», но каждый раз, когда я сохраняю новую запись и возвращаюсь в таблицу, она пуста.

Я вижу полную ошибку:

*** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:5678
2011-10-01 22:48:11.860 Gradetrack[59617:207] Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath: with userInfo (null)

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

2011-10-01 23:08:50.332 Gradetrack[59795:207] >>> Enumber of courses entered thus far: 4 
2011-10-01 23:08:50.334 Gradetrack[59795:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:5678
2011-10-01 23:08:50.337 Gradetrack[59795:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00fd05a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x01124313 objc_exception_throw + 44
    2   CoreFoundation                      0x00f88ef8 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x000e43bb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x0035ec91 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 883
    5   UIKit                               0x003544cc -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
    6   UIKit                               0x003698cc -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
    7   UIKit                               0x0036190c -[UITableView layoutSubviews] + 242
    8   QuartzCore                          0x01f70a5a -[CALayer layoutSublayers] + 181
    9   QuartzCore                          0x01f72ddc CALayerLayoutIfNeeded + 220
    10  QuartzCore                          0x01f180b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
    11  QuartzCore                          0x01f19294 _ZN2CA11Transaction6commitEv + 292
    12  UIKit                               0x002eb9c9 -[UIApplication _reportAppLaunchFinished] + 39
    13  UIKit                               0x002ebe83 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 690
    14  UIKit                               0x002f6617 -[UIApplication handleEvent:withNewEvent:] + 1533
    15  UIKit                               0x002eeabf -[UIApplication sendEvent:] + 71
    16  UIKit                               0x002f3f2e _UIApplicationHandleEvent + 7576
    17  GraphicsServices                    0x01928992 PurpleEventCallback + 1550
    18  CoreFoundation                      0x00fb1944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    19  CoreFoundation                      0x00f11cf7 __CFRunLoopDoSource1 + 215
    20  CoreFoundation                      0x00f0ef83 __CFRunLoopRun + 979
    21  CoreFoundation                      0x00f0e840 CFRunLoopRunSpecific + 208
    22  CoreFoundation                      0x00f0e761 CFRunLoopRunInMode + 97
    23  UIKit                               0x002eb7d2 -[UIApplication _run] + 623
    24  UIKit                               0x002f7c93 UIApplicationMain + 1160
    25  Gradetrack                          0x00002034 main + 102
    26  Gradetrack                          0x00001fc5 start + 53

На основании операторов NSLog это последняя выполненная подпрограмма.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    NSLog(@">>> Enteringg %s [Line %d] ", __PRETTY_FUNCTION__, __LINE__);   

    id <NSFetchedResultsSectionInfo> sectionInfo = 
    [[_fetchedResultsController sections] objectAtIndex:section];
    NSLog(@">>> Enumber of courses entered thus far: %d ", [sectionInfo numberOfObjects]);  

    return [sectionInfo numberOfObjects];
}

Примечание: вывод из числа введенных к настоящему времени курсов ... составил 4, что было правильно.

Здесь я возвращаю ячейки обратно в UITableViewController

- (UITableViewCell *)tableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
    NSLog(@">>> Entering %s [Line %d] ", __PRETTY_FUNCTION__, __LINE__);    

    static NSString *CellIdentifier = @"Cell";

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

    // Set up the cell...
    [tableView setAllowsSelectionDuringEditing:NO];
    [self configureCell:cell atIndexPath:indexPath];
    // load the cell with an appropriate image
    NSString *path = [[NSBundle mainBundle] pathForResource:@"studentprofile" ofType:@"png"];
    UIImage *theImage = [UIImage imageWithContentsOfFile:path];
    cell.imageView.image = theImage;

    return cell;
}

Исходя из этих ошибок и моей трассировки стека, кто-нибудь может указать мне правильное направление?

Большое спасибо,

Phil

Ответы [ 7 ]

18 голосов
/ 18 марта 2012

Я только что столкнулся с той же проблемой, но я небрежно заявил:

<UITableViewDelegate, UITableViewDelegate>

, а не правильно:

<UITableViewDelegate, UITableViewDataSource>

Джо

* обновление - у меня естьтакже заметил, что в xCode 4.3 шаблон, сгенерированный при создании нового класса UITableViewController, не содержит ключевой элемент в cellForRowAtIndexPath.То есть:

    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
3 голосов
/ 03 октября 2011

Хорошо, извините, предупреждение SNAFU.

Я не уверен, как это произошло, но если вы заметили в моем объявлении функции для "cellForRowAtIndexPath" ... он просто имеет atIndexPath вместо cellForRowAtIndexPath. Я, должно быть, сделал какой-то неуместный глобальный поиск и замену, и это разрушило мой проект.

Работаю сейчас. Спасибо.

Вопрос - почему код компилируется без ошибок или предупреждений - Ух ты - это заняло слишком много времени.

2 голосов
/ 02 октября 2011

Исходя из UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:, похоже, что вы могли забыть установить идентификатор ячейки при создании экземпляра:

cell = ((DetailCell *)[tableView dequeueReusableCellWithIdentifier:DetailCellIdentifier]);
if (! cell)
{
    // build the cell here
}

Если нет, то где в коде вызывается ошибка?

1 голос
/ 06 января 2013

В моем случае iOS 5.0 ~ 6.0 с раскадровкой должна иметь одинаковый идентификатор ячейки между методом

(- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath) and **storyboard file**.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell"; ... }

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

При создании подкласса файла UITableView в коде по умолчанию используется @ "Cell", но не раскадровка, пустая.Так что надо обратить внимание.

0 голосов
/ 02 августа 2013

Я только что боролся с этим утверждением в течение нескольких часов.Я пытался добавить UIButton в качестве подпредставления в ячейку, которая также была в перо.Очевидно, «Autolayout» это не нравится, поэтому после отмены выбора опции в моем перо я больше не получаю сбой.

0 голосов
/ 03 января 2013

Я получил это исключение, когда случайно удалил return cell в tableView:cellForRowAtIndexPath:.Это исключение возникает, когда ячейка не создается или не возвращается.

0 голосов
/ 24 декабря 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...