NSInternalInconsistencyException(无效的更新:第0节中的行数无效) [英] NSInternalInconsistencyException(Invalid update: invalid number of rows in section 0)

查看:455
本文介绍了NSInternalInconsistencyException(无效的更新:第0节中的行数无效)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设计的过程是:


  1. 通过模型Segue输入CourseAddViewController(UITableViewController);

  2. 右侧栏按钮显示完成(在此状态下,表格视图显示每个行中的所有数据为 - ,但底部的附加行显示为+);

  3. 按完成按钮保存数据。

当我添加语句self.editing = YES;

When I add the statement "self.editing = YES;" in - (void)viewDidLoad method, it will crash.

我发现它没有执行tableView:cellForRowAtIndexPath:方法。但是,实际上我相信通过NSLog()的结果在第0节中有1行。

如果我不添加self.editing = YES;,它运行正确。

If I don't add "self.editing = YES;", it run correctly.

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
    self.editing = YES;     // here: adding it cause crash
}

执行insertRowsAtIndexPaths:withRowAnimation: ,它崩溃了。
两个语句:

After performing "insertRowsAtIndexPaths:withRowAnimation:", it crashed. Two statement:

[self.tableView beginUpdates];
[self.tableView endUpdates];

添加或不添加,所有cuase崩溃。

add them or not, all cuase crash.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];

    [self.tableView beginUpdates];

    NSInteger booksCount = self.course.books.count;

    NSArray *booksInsertIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:booksCount inSection:0]];

    if (editing) {
        [self.tableView insertRowsAtIndexPaths:booksInsertIndexPath 
                              withRowAnimation:UITableViewRowAnimationBottom];  // then, it crashes
    } else {
        [self.tableView deleteRowsAtIndexPaths:booksInsertIndexPath 
                              withRowAnimation:UITableViewRowAnimationBottom];
    }

    [self.tableView endUpdates];

    // ...

}

其他方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSLog(@"%d", self.fetchedResultsController.sections.count);     // the result is always 1;

    return self.fetchedResultsController.sections.count;
}

其他方法,

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController.sections objectAtIndex:section];
    NSInteger rows = [sectionInfo numberOfObjects];
    if (self.editing)
        rows++; 

    NSLog(@"%d", rows);     // the result is always 1;

    return rows;
}

其他方法,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController.sections objectAtIndex:indexPath.section];
    NSInteger rows = [sectionInfo numberOfObjects];
    if (self.editing && rows == indexPath.row) {
        return  cell;
    }
    [self configureCell:cell atIndexPath:indexPath];

//    NSLog(@"%d-%d-%d-%d", self.editing, rows, indexPath.section, indexPath.row);

    return cell;
}

新编辑:

2012-10-27 08:44:29.934 Course Table[306:fb03] *** Assertion failure in
 -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/
UIKit-914.84/UITableView.m:1037
2012-10-27 08:44:29.935 Course Table[306:fb03] CRASH: Invalid update: 
invalid number of rows in section 0.  The number of rows contained in 
an existing section after the update (1) must be equal to the number 
of rows contained in that section before the update (1), plus or 
minus the number of rows inserted or deleted from that section 
(1 inserted, 0 deleted) and plus or minus the number of rows moved
into or out of that section (0 moved in, 0 moved out).
2012-10-27 08:44:29.942 Course Table[306:fb03] Stack Trace: (
    0   CoreFoundation                      0x016cf03e __exceptionPreprocess + 206
    1   libobjc.A.dylib                     0x01860cd6 objc_exception_throw + 44
    2   CoreFoundation                      0x01677a48 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x009d12cb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x000bf3d7 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 12439
    5   UIKit                               0x000ca6d2 -[UITableView _updateRowsAtIndexPaths:updateAction:withRowAnimation:] + 295
    6   UIKit                               0x000ca711 -[UITableView insertRowsAtIndexPaths:withRowAnimation:] + 55
    7   Course Table                        0x0000ef42 -[CTXCourseAddViewController setEditing:animated:] + 434
    8   UIKit                               0x0010de4c -[UIViewController(UINavigationControllerItem) setEditing:] + 49
    9   Course Table                        0x0000ec1f -[CTXCourseAddViewController viewDidLoad] + 655
    10  UIKit                               0x00101a1e -[UIViewController view] + 184
    11  UIKit                               0x00100fec -[UIViewController nextResponder] + 34
    12  UIKit                               0x00127f1d -[UIResponder _containsResponder:] + 40
    13  UIKit                               0x001121cb -[UINavigationController defaultFirstResponder] + 83
    14  UIKit                               0x00128df1 -[UIResponder(Internal) _deepestDefaultFirstResponder] + 36
    15  UIKit                               0x00128ea9 -[UIResponder(Internal) _promoteDeepestDefaultFirstResponder] + 36
    16  UIKit                               0x00322508 -[UIWindowController transitionViewDidStart:] + 89
    17  UIKit                               0x000df401 -[UITransitionView _didStartTransition] + 93
    18  UIKit                               0x000e008b -[UITransitionView transition:fromView:toView:] + 1169
    19  UIKit                               0x00321d6c -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 6114
    20  UIKit                               0x00108857 -[UIViewController presentViewController:withTransition:completion:] + 3579
    21  UIKit                               0x001089bc -[UIViewController presentViewController:animated:completion:] + 112
    22  UIKit                               0x001089fc -[UIViewController presentModalViewController:animated:] + 56
    23  UIKit                               0x00470f4a -[UIStoryboardModalSegue perform] + 250
    24  UIKit                               0x004654d0 -[UIStoryboardSegueTemplate perform:] + 174
    25  CoreFoundation                      0x016d0e99 -[NSObject performSelector:withObject:withObject:] + 73
    26  UIKit                               0x0003d14e -[UIApplication sendAction:to:from:forEvent:] + 96
    27  UIKit                               0x0027ba0e -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 145
    28  CoreFoundation                      0x016d0e99 -[NSObject performSelector:withObject:withObject:] + 73
    29  UIKit                               0x0003d14e -[UIApplication sendAction:to:from:forEvent:] + 96
    30  UIKit                               0x0003d0e6 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
    31  UIKit                               0x000e3ade -[UIControl sendAction:to:forEvent:] + 66
    32  UIKit                               0x000e3fa7 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503
    33  UIKit                               0x000e3266 -[UIControl touchesEnded:withEvent:] + 549
    34  UIKit                               0x000623c0 -[UIWindow _sendTouchesForEvent:] + 513
    35  UIKit                               0x000625e6 -[UIWindow sendEvent:] + 273
    36  UIKit                               0x00048dc4 -[UIApplication sendEvent:] + 464
    37  UIKit                               0x0003c634 _UIApplicationHandleEvent + 8196
    38  GraphicsServices                    0x015b9ef5 PurpleEventCallback + 1274
    39  CoreFoundation                      0x016a3195 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
    40  CoreFoundation                      0x01607ff2 __CFRunLoopDoSource1 + 146
    41  CoreFoundation                      0x016068da __CFRunLoopRun + 2218
    42  CoreFoundation                      0x01605d84 CFRunLoopRunSpecific + 212
    43  CoreFoundation                      0x01605c9b CFRunLoopRunInMode + 123
    44  GraphicsServices                    0x015b87d8 GSEventRunModal + 190
    45  GraphicsServices                    0x015b888a GSEventRun + 103
    46  UIKit                               0x0003a626 UIApplicationMain + 1163
    47  Course Table                        0x000020dd main + 141
    48  Course Table                        0x00002045 start + 53
)
2012-10-27 08:44:29.945 Course Table[306:fb03] *** 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 (1) must be equal to the number 
of rows contained in that section before the update (1), plus or minus
the number of rows inserted or deleted from that section (1 inserted,
0 deleted) and plus or minus the number of rows moved into or out of that 
section (0 moved in, 0 moved out).
terminate called throwing an exception(lldb) 


推荐答案

只需添加

[self.tableView reloadData];

之前

self.editing = YES;

这是必需的,因为表视图最初没有有关其数据源和委托的信息;如果你创建一个表视图,它总是需要发送一个 reloadData 消息作为其初始化的一部分。

This is needed because the table view doesn't initially have information about its data source and delegate; if you create a table view, it always needs to be sent a reloadData message as part of its initialization.

这篇关于NSInternalInconsistencyException(无效的更新:第0节中的行数无效)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆