NSInternalInconsistencyException(无效更新:第 0 节中的行数无效)
Posted
技术标签:
【中文标题】NSInternalInconsistencyException(无效更新:第 0 节中的行数无效)【英文标题】:NSInternalInconsistencyException(Invalid update: invalid number of rows in section 0) 【发布时间】:2012-10-26 15:51:00 【问题描述】:我设计的过程是这样的:
-
通过 Model Segue 进入 CourseAddViewController(UITableViewController);
右侧栏按钮显示“Done”(在此状态下,tableview 显示每一行中的所有数据以“-”显示,但底部的附加行以“+”显示);
按“完成”按钮,保存数据。
当我添加语句“self.editing = YES;”时在 - (void)viewDidLoad 方法中,它会崩溃。
我发现它没有执行“tableView:cellForRowAtIndexPath:”方法。但是,实际上我相信通过NSLog()的结果在第0节中有1行。
如果我不添加“self.editing = YES;”,它会正常运行。
- (void)viewDidLoad
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = self.editButtonItem;
self.editing = YES; // here: adding it cause crash
执行“insertRowsAtIndexPaths:withRowAnimation:”后,它崩溃了。 两种说法:
[self.tableView beginUpdates];
[self.tableView endUpdates];
添加与否,都会导致崩溃。
- (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.editing = YES;
之前添加[self.tableView reloadData];
会怎样?
@H2CO3 谢谢,通过添加[self.tableView reloadData]可以正常运行;在设置 self.editing = YES; 之前。但我不明白为什么要这样做?你能帮帮我吗?
【参考方案1】:
只需添加
[self.tableView reloadData];
之前
self.editing = YES;
这是必需的,因为表格视图最初没有关于其数据源和委托的信息;如果您创建一个表格视图,它总是需要在其初始化过程中发送reloadData
消息。
【讨论】:
以上是关于NSInternalInconsistencyException(无效更新:第 0 节中的行数无效)的主要内容,如果未能解决你的问题,请参考以下文章