Пример базовых данных, неверное обновление: неверное количество строк в разделе 0 - PullRequest
4 голосов
/ 18 февраля 2011

Я новичок в iOS и XCode, работаю над учебным курсом по основным данным, и я действительно в замешательстве.Я постоянно получаю сообщение об ошибке в журналах ошибок:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
iPhone Simulator 235, iPhone OS 4.2 (iPad/8C134)
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted).'
*** Call stack at first throw:
(
        0   CoreFoundation                      0x010a6be9 __exceptionPreprocess + 185
        1   libobjc.A.dylib                     0x00e9b5c2 objc_exception_throw + 47
        2   CoreFoundation                      0x0105f628 +[NSException raise:format:arguments:] + 136
        3   Foundation                          0x000b447b -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
        4   UIKit                               0x00336a0f -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 8424
        5   UIKit                               0x00325f81 -[UITableView insertRowsAtIndexPaths:withRowAnimation:] + 56
        6   SimpleRes                           0x00002496 -[RootViewController addReservation] + 465
        7   UIKit                               0x002b9a6e -[UIApplication sendAction:to:from:forEvent:] + 119
        8   UIKit                               0x004c7167 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 156
        9   UIKit                               0x002b9a6e -[UIApplication sendAction:to:from:forEvent:] + 119
        10  UIKit                               0x003481b5 -[UIControl sendAction:to:forEvent:] + 67
        11  UIKit                               0x0034a647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
        12  UIKit                               0x003491f4 -[UIControl touchesEnded:withEvent:] + 458
        13  UIKit                               0x002de0d1 -[UIWindow _sendTouchesForEvent:] + 567
        14  UIKit                               0x002bf37a -[UIApplication sendEvent:] + 447
        15  UIKit                               0x002c4732 _UIApplicationHandleEvent + 7576
        16  GraphicsServices                    0x018bda36 PurpleEventCallback + 1550
        17  CoreFoundation                      0x01088064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
        18  CoreFoundation                      0x00fe86f7 __CFRunLoopDoSource1 + 215
        19  CoreFoundation                      0x00fe5983 __CFRunLoopRun + 979
        20  CoreFoundation                      0x00fe5240 CFRunLoopRunSpecific + 208
        21  CoreFoundation                      0x00fe5161 CFRunLoopRunInMode + 97
        22  GraphicsServices                    0x018bc268 GSEventRunModal + 217
        23  GraphicsServices                    0x018bc32d GSEventRun + 115
        24  UIKit                               0x002c842e UIApplicationMain + 1160
        25  SimpleRes                           0x00001ab0 main + 102
        26  SimpleRes                           0x00001a41 start + 53
)

Вот мой код addReservation:

-(void)addReservation{

    // Create and configure a new instance of the Event entity.
    Reservations *reservation = (Reservations *)[NSEntityDescription insertNewObjectForEntityForName:@"Reservations" inManagedObjectContext:managedObjectContext];

    [reservation setEnd_Time: [[NSDate alloc]init]];
    [reservation setReservation_Date:[[NSDate alloc]init]];
    [reservation setStart_Time:[NSDate date]];
    [reservation setParty_Size: [NSNumber numberWithInt:4]];
    [reservation setPhone_Number: [NSNumber numberWithInt: 1234567890]];
    [reservation setName: @"Keith"];
    [reservation setNotes: @"He's really hot!"];
    [reservation setPerson_Responsible: @"Lisa"];
    [reservation setTables_Excluded: @"3,5,8"];

    NSError *error = nil;
    if (![managedObjectContext save:&error]) {
        }

    [resArray insertObject:reservation atIndex:0];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                          withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

Я считаю, что мой resArray не получает данные из методачто я ввожу программно, но я не уверен, и я не уверен, как это исправить.

Любая помощь приветствуется.

Ответы [ 4 ]

30 голосов
/ 18 февраля 2011

Я бы посмотрел на вашу реализацию

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

Указанная ошибка возникает, когда значение, возвращаемое из numberOfRowsInSection, не равно предыдущему значению плюс число строк, добавленных с использованием insertRowsAtIndexPaths. Если ваша реализация numberOfRowsInSection использует [myArray count], то убедитесь, что используемый экземпляр массива тот же, в который вы добавляете запись резервирования. Если вы не реализовали этот метод, то это будет вашей проблемой. Вот пример того, как этот метод должен выглядеть:

- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section {
    return [resArray count];
}

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

11 голосов
/ 19 марта 2012

Порядок, который вы удаляете / вставляете из tableView и удаляете / вставляете из базового источника данных, может быть важным.В документации Apple сначала обновляется представление, а затем источник данных.Однако удаление / вставка из представления внутренне вызывает - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section, который, если вы похожи на меня, возвращает count базового источника данных.Поскольку это не изменилось, среда выполнения будет жаловаться и вылетать.Поэтому сначала удалите из своего источника данных, а затем просмотр.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [recentImages count];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    // Delete from underlying data source first!
    recentImages = [recentImages removeObjectAtIndex:indexPath.row];

    // Then perform the action on the tableView
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {   
        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];        
        [tableView endUpdates];
    }

    // Finally, reload data in view
    [self.tableView reloadData];
}
0 голосов
/ 01 сентября 2016
  • (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) раздел {

    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
    

    }

  • (пусто)) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editStyle forRowAtIndexPath: (NSIndexPath *) indexPath {

    if (editStyle == UITableViewCellEditingSellEditingStyleDelete) {* 101 * **4

Это работает при удалении и добавлении записей в таблицу основных данных с fetchedResultsController.

0 голосов
/ 11 июня 2013

Для меня это выглядит так, как будто вы вставляете объект, прежде чем вносить в него изменения.Я могу ошибаться, так как я тоже новичок!

...