Ipad 核心数据示例,无效更新:节0中的行数无效
我是iOS和XCode的新手,正在学习一个核心数据教程,我真的被难倒了。我不断从以下错误日志中获取错误:Ipad 核心数据示例,无效更新:节0中的行数无效,ipad,ios,core-data,Ipad,Ios,Core Data,我是iOS和XCode的新手,正在学习一个核心数据教程,我真的被难倒了。我不断从以下错误日志中获取错误: Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000 Crashed Thread: 0 Dispatch queue: com.apple.main-thread Application Specific Information: iPhone Simu
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
)
这是我的预约代码:
-(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];
}
我相信我的重新排列不是从我以编程方式输入的方法中获取数据,但我不确定,也不确定如何修复它
非常感谢您的帮助。我会看看您对
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
当从numberOfRowsInSection返回的值不等于上一个值加上使用InsertRowsAndExpaths添加的行数时,会发生指定的错误。如果numberOfRowsInSection的实现使用的是[myArray count],那么请确保使用的数组实例与添加保留项的数组实例相同。如果您尚未实现此方法,那么这将是您的问题。下面是该方法的外观示例:
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [resArray count];
}
作为备份,您可以添加日志语句,列出添加前后以及numberOfRowsInSection函数内部的数组大小。从tableView中删除/插入以及从基础数据源中删除/插入的顺序可能很重要。Apple文档首先更新视图,然后更新数据源。但是,从视图中删除/插入会在内部调用
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
,如果您和我一样,它会返回底层数据源的计数。因为这一点没有改变,运行时将抱怨并崩溃。因此,首先从数据源中删除,然后从视图中删除
- (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];
}
对我来说,它看起来像是在你准确地对它进行更改之前插入对象。我可能错了,因为我也是个新手
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self.tableView beginUpdates];
// Delete the object that was swiped
YourTableName *objectToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"Deleting (%@)", objectToDelete.fieldname);
[self.managedObjectContext deleteObject: objectToDelete];
[self.managedObjectContext save:nil];
// Delete the (now empty) row on the table
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView reloadData];
[self.tableView endUpdates];
}
}
当使用fetchedResultsController删除记录并将记录添加到核心数据表时,此操作有效 如果您遵循Apple iOS Core Data教程,则模板生成的文件的行返回0;对于NumberOfSectionsTable委托方法。只需将该行更改为返回1,它就应该很好了。最后对reloadData
的调用是多余的。您应该使用begin
/endUpdates
将表与基础数据同步,或者使用reloadData
重新加载所有数据(这在CPU方面成本更高,对用户来说可能不太好)。但没有必要两者兼而有之。我已提交编辑。如果你像我一样笨,数组可能为空。:)