无效更新:在第0终止与类型NSException的未捕获的异常行数量无效

问题描述:

我读过所有关于此相关的职位和我仍然有一个错误:无效更新:在第0终止与类型NSException的未捕获的异常行数量无效

'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

下面是详细信息:

我使用代码打开钢琴表时,打开单元格它给子单元格每行有不同数量的单元格它是工作正常,但我需要修改一些事情,当我点击行它打开然后如果我点击另一个排我需要它打开第二个并关闭第一个打开的行 这是我的代码 rootView.m

#pragma -mark TableViewDelegate 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 5; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    GCRetractableSectionController* sectionController = [self.retractableControllers objectAtIndex:section]; 
    // NSLog(@"sectionController.numberOfRow %d",sectionController.numberOfRow); 
    return sectionController.numberOfRow; 
} 

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

    GCRetractableSectionController* sectionController = [self.retractableControllers objectAtIndex:indexPath.section]; 
    return [sectionController cellForRow:indexPath.row]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"index path section %d indexrow %d",indexPath.section ,indexPath.row); 

    GCRetractableSectionController* sectionController = [self.retractableControllers objectAtIndex:indexPath.section]; 


    // vc.open = !vc.open; 


// return [sectionController didSelectCellAtRow:indexPath.row]; 



    if (indexPath.row == 1) { 
     [myCustomView setHidden:YES]; 
      NSLog(@"index path 11111 111111 1111111 indexrow %d",indexPath.row); 



    } 
    else if (indexPath.row == 2) { 
    } 

    return [sectionController didSelectCellAtRow:indexPath.row]; 




} 

// GCRetractableSectionController.m

#import "GCRetractableSectionController.h" 
#import "RootViewController.h" 

@interface GCRetractableSectionController() 

@property (nonatomic, assign) UIViewController *viewController; 

- (void) setAccessoryViewOnCell:(UITableViewCell*) cell; 

@end 

@implementation GCRetractableSectionController 

@synthesize useOnlyWhiteImages, titleTextColor, titleAlternativeTextColor; 
@synthesize viewController; 
@synthesize open, rowAnimation; 
@synthesize backUp; 
#pragma mark - 
#pragma mark Initialisation 

- (id) initWithViewController:(UIViewController*) givenViewController { 
    if ((self = [super init])) { 
     if (![givenViewController respondsToSelector:@selector(tableView)]) { 
      //The view controller MUST have a tableView proprety 
      [NSException raise:@"Wrong view controller" 
         format:@"The passed view controller to GCRetractableSectionController must respond to the tableView proprety"]; 
     } 
     self.viewController = givenViewController; 
    // self.open = NO; 
     self.useOnlyWhiteImages = NO; 
     self.rowAnimation = UITableViewRowAnimationTop; 

    } 
    return self; 
} 

#pragma mark - 
#pragma mark Getters 

- (UITableView*) tableView { 
    return [self.viewController performSelector:@selector(tableView)]; 
} 

- (NSUInteger) numberOfRow { 
    NSLog(@"the count %d",self.contentNumberOfRow); 

    return (self.open) ? self.contentNumberOfRow + 1 : 1; 
} 

- (NSUInteger) contentNumberOfRow { 
    return 0; 
} 

- (NSString*) title { 
    return NSLocalizedString(@"No title",); 
} 

- (NSString*) titleContentForRow:(NSUInteger) row { 
    return NSLocalizedString(@"No title",); 
} 

#pragma mark - 
#pragma mark Cells 

- (UITableViewCell *) cellForRow:(NSUInteger)row { 
    UITableViewCell* cell = nil; 

    if (row == 0) cell = [self titleCell]; 
    else cell = [self contentCellForRow:row - 1]; 

    return cell; 
} 

- (UITableViewCell *) titleCell { 
    NSString* titleCellIdentifier = [NSStringFromClass([self class]) stringByAppendingString:@"title"]; 

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:titleCellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:titleCellIdentifier]; 
    } 

    cell.textLabel.text = self.title; 
    if (self.contentNumberOfRow != 0) { 
     cell.detailTextLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%i items",), self.contentNumberOfRow]; 
     cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
     [self setAccessoryViewOnCell:cell]; 
    } 
    else { 
     cell.detailTextLabel.text = NSLocalizedString(@"No item",); 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.accessoryView = nil; 
     cell.textLabel.textColor = [UIColor blackColor]; 
    } 

    return cell; 
} 

- (UITableViewCell *) contentCellForRow:(NSUInteger)row { 
    NSString* contentCellIdentifier = [NSStringFromClass([self class]) stringByAppendingString:@"content"]; 

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:contentCellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:contentCellIdentifier] ; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 

    cell.textLabel.text = [self titleContentForRow:row]; 

    return cell; 
} 

- (void) setAccessoryViewOnCell:(UITableViewCell*) cell { 
    NSString* path = nil; 
    if (self.open) { 
     path = @"UpAccessory"; 
     if (self.titleAlternativeTextColor == nil) cell.textLabel.textColor = [UIColor colorWithRed:0.191 green:0.264 blue:0.446 alpha:1.000]; 
     else cell.textLabel.textColor = self.titleAlternativeTextColor; 
    } 
    else { 
     path = @"DownAccessory"; 
     cell.textLabel.textColor = (self.titleTextColor == nil ? [UIColor blackColor] : self.titleTextColor); 
    } 

    UIImage* accessoryImage = [UIImage imageNamed:path]; 
    UIImage* whiteAccessoryImage = [UIImage imageNamed:[[path stringByDeletingPathExtension] stringByAppendingString:@"White"]]; 

    UIImageView* imageView; 
    if (cell.accessoryView != nil) { 
     imageView = (UIImageView*) cell.accessoryView; 
     imageView.image = (self.useOnlyWhiteImages ? whiteAccessoryImage : accessoryImage); 
     imageView.highlightedImage = whiteAccessoryImage; 
    } 
    else { 
     imageView = [[UIImageView alloc] initWithImage:(self.useOnlyWhiteImages ? whiteAccessoryImage : accessoryImage)]; 
     imageView.highlightedImage = whiteAccessoryImage; 
     cell.accessoryView = imageView; 
    } 
} 

#pragma mark - 
#pragma mark Select Cell 

- (void) didSelectCellAtRow:(NSUInteger)row { 
    if (row == 0) { 
      [self didSelectTitleCell]; 
    } 
    else [self didSelectContentCellAtRow:row - 1]; 
} 

- (void) didSelectTitleCell { 


    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSData *myDecodedObject = [userDefaults objectForKey:@"tableViewDataPrevious"]; 
    NSMutableArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject]; 
    NSLog(@"the back Up Count %d",[decodedArray count]); 
    if ([decodedArray count]!=0){ 

     NSLog(@"Back Up Array "); 
     NSLog(@"am here herer hererer hererer %@ " , decodedArray); 



     // it quit here 
     [self.tableView deleteRowsAtIndexPaths:decodedArray withRowAnimation:self.rowAnimation]; 
     // 


     [self.tableView reloadData]; 

     [self.tableView endUpdates]; 

//  NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; 
//  [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 
     NSLog(@"am here herer hererer hererer"); 

    } 

    NSLog(@"didSelectedTitleCell"); 
    self.open = !self.open; 
    NSLog(@"1"); 
    if (self.contentNumberOfRow != 0) [self setAccessoryViewOnCell:[self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]]]; 

    NSIndexPath* indexPath = [self.tableView indexPathForSelectedRow]; 

    NSUInteger section = indexPath.section; 
    NSUInteger contentCount = self.contentNumberOfRow; 

    [self.tableView beginUpdates]; 

    NSMutableArray* rowToInsert = [[NSMutableArray alloc] init]; 
    for (NSUInteger i = 1; i < contentCount + 1; i++) { 
     NSIndexPath* indexPathToInsert = [NSIndexPath indexPathForRow:i inSection:section]; 
     [rowToInsert addObject:indexPathToInsert]; 
    } 

    if (self.open) { 


     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
     NSData *myDecodedObject = [userDefaults objectForKey:@"tableViewDataPrevious"]; 
     NSMutableArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject]; 

     NSLog(@"the back Up Count %d",[decodedArray count]); 

     if ([decodedArray count]!=0){ 

      NSLog(@"Back Up Array "); 
     [self.tableView deleteRowsAtIndexPaths:decodedArray withRowAnimation:self.rowAnimation]; 


      //[self.tableView endUpdates]; 

      NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; 
      [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 


     } 
      [self.tableView insertRowsAtIndexPaths:rowToInsert withRowAnimation:self.rowAnimation]; 

     [self.tableView endUpdates]; 



     backUp = [[NSMutableArray alloc]init]; 
     [backUp addObjectsFromArray:rowToInsert]; 
     NSLog(@"the back Up Count %@", backUp); 
     NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:backUp]; 

     [userDefaults setObject:myEncodedObject forKey:@"tableViewDataPrevious"]; 
     ; 
     [userDefaults synchronize]; 




    } 
    else { 
     [self.tableView deleteRowsAtIndexPaths:rowToInsert withRowAnimation:self.rowAnimation]; 
     [self.tableView endUpdates]; 
} 


    [self.tableView endUpdates]; 

    if (self.open) [self.tableView scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

- (void) didSelectContentCellAtRow:(NSUInteger)row { 

} 

@end 

和输出

2014-10-09 13:10:13.747 Brnlysta2[10199:90b] the back Up Count (
     "<NSIndexPath: 0x8e8fb80> {length = 2, path = 0 - 1}", 
     "<NSIndexPath: 0x8e87900> {length = 2, path = 0 - 2}", 
     "<NSIndexPath: 0x8e871c0> {length = 2, path = 0 - 3}", 
     "<NSIndexPath: 0x8e908e0> {length = 2, path = 0 - 4}" 
    ) 
    2014-10-09 13:10:14.717 Brnlysta2[10199:90b] index path section 1 indexrow 0 
    2014-10-09 13:10:14.718 Brnlysta2[10199:90b] the back Up Count 4 
    2014-10-09 13:10:14.718 Brnlysta2[10199:90b] Back Up Array 
    2014-10-09 13:10:14.719 Brnlysta2[10199:90b] am here herer hererer hererer (
     "<NSIndexPath: 0x8b3bb60> {length = 2, path = 0 - 1}", 
     "<NSIndexPath: 0x8b8e5c0> {length = 2, path = 0 - 2}", 
     "<NSIndexPath: 0x8b75f60> {length = 2, path = 0 - 3}", 
     "<NSIndexPath: 0x8b7b960> {length = 2, path = 0 - 4}" 
    ) 
    2014-10-09 13:10:14.719 Brnlysta2[10199:90b] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2935.137/UITableView.m:1368 
    2014-10-09 13:10:14.722 Brnlysta2[10199:90b] *** 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 (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 4 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' 
    *** First throw call stack: 
    (
     0 CoreFoundation      0x017fe1e4 __exceptionPreprocess + 180 
     1 libobjc.A.dylib      0x0157d8e5 objc_exception_throw + 44 
     2 CoreFoundation      0x017fe048 +[NSException raise:format:arguments:] + 136 
     3 Foundation       0x0115d4de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116 
     4 UIKit        0x00315f63 -[UITableView _endCellAnimationsWithContext:] + 13402 
     5 UIKit        0x00326590 -[UITableView _updateRowsAtIndexPaths:updateAction:withRowAnimation:] + 337 
     6 UIKit        0x0032660b -[UITableView deleteRowsAtIndexPaths:withRowAnimation:] + 55 
     7 Brnlysta2       0x0000368e -[GCRetractableSectionController didSelectTitleCell] + 382 
     8 Brnlysta2       0x000034d7 -[GCRetractableSectionController didSelectCellAtRow:] + 71 
     9 Brnlysta2       0x00008f13 -[RootViewController tableView:didSelectRowAtIndexPath:] + 531 
     10 UIKit        0x003279a1 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1513 
     11 UIKit        0x00327b14 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 279 
     12 UIKit        0x0032c10e __38-[UITableView touchesEnded:withEvent:]_block_invoke + 43 
     13 UIKit        0x0025b0aa ___afterCACommitHandler_block_invoke + 15 
     14 UIKit        0x0025b055 _applyBlockToCFArrayCopiedToStack + 403 
     15 UIKit        0x0025ae76 _afterCACommitHandler + 532 
     16 CoreFoundation      0x017c636e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 
     17 CoreFoundation      0x017c62bf __CFRunLoopDoObservers + 399 
     18 CoreFoundation      0x017a4254 __CFRunLoopRun + 1076 
     19 CoreFoundation      0x017a39d3 CFRunLoopRunSpecific + 467 
     20 CoreFoundation      0x017a37eb CFRunLoopRunInMode + 123 
     21 GraphicsServices     0x037a25ee GSEventRunModal + 192 
     22 GraphicsServices     0x037a242b GSEventRun + 104 
     23 UIKit        0x0023df9b UIApplicationMain + 1225 
     24 Brnlysta2       0x0000669d main + 141 
     25 libdyld.dylib      0x01e43725 start + 0 
    ) 
    libc++abi.dylib: terminating with uncaught exception of type NSException 

当你做一些编辑/更新的UITableView,但查了一些数据源方法,如果数据的完整性仍是否存在。你有这个问题。在您的numberOfSectionsInTableViewtableView: numberOfRowsInSection:方法中,有一个错误的计算。在调用deleteRowsAtIndexPaths之前,还需要更新用于计算节/行数的必要属性。

顺便说一句,在deleteRowsAtIndexPaths之后使用reloadData没有意义。它可能会干扰你的删除动画。

+0

我们无法看到numberOfSectionsInTableView和tableView:numberOfRowsInSection:方法。 – dadalar 2014-10-09 11:47:28

+0

好吧,它的长,我使用多个对象的行和每个控制器返回的行数在其行的部分 – cat 2014-10-09 11:50:59

+0

但让我说我有4节,我有4个劳斯,2有6行,3有6行,4是空的 – cat 2014-10-09 11:52:07