Dan*_*npe 4 core-data objective-c uitableview ios
当我的UITableView为空时,我正在尝试放置一个自定义的空单元格.
我使用以下代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int count = [self.fetchedResultsController fetchedObjects].count;
if (count == 0) {
return 1;
}
return count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell * cell = nil;
int count = [self.fetchedResultsController fetchedObjects].count;
if (count == 0) {
// return empty cell
cell = [self getEmptyCellOfTableView:tableView cellForRowAtIndexPath:indexPath];
} else {
cell = [self getMyQuestionCellOfTableView:tableView cellForRowAtIndexPath:indexPath];
}
return cell;
}
Run Code Online (Sandbox Code Playgroud)
FRC didChangeObject实现:
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
{
switch(type)
{
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是完美的,problam是当fetchedObject.count> 0时,我得到以下错误:
CoreData: error: Serious application error.
An exception was caught from the delegate of NSFetchedResultsController during a call to -
controllerDidChangeContent: 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).
with userInfo (null)
Run Code Online (Sandbox Code Playgroud)
我知道发生这种情况是因为我插入了1个新行,并且计数保持为1而不是2.
我该如何解决它以适应我的行为?
Mar*_*n R 12
更新表视图后,返回的值numberOfRowsInSection必须与先前的行数加上插入的行数减去已删除的行数完全匹配.
在您的情况下,当插入第一个对象时insertRowsAtIndexPaths,在新对象的FRC委托方法中调用,但不是显示另一行,而是将"空"单元格替换为不同的单元格,因此行数仍然是一.
如果您修改FRC委托方法controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
,它应该工作
如下:
case NSFetchedResultsChangeInsert:
if ([[self.fetchedResultsController fetchedObjects] count] == 1) {
// First object inserted, "empty cell" is replaced by "object cell"
[tableView reloadRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
} else {
[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}
break;
case NSFetchedResultsChangeDelete:
if ([[self.fetchedResultsController fetchedObjects] count] == 0) {
// Last object removed, "object cell" is replaced by "empty cell"
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else {
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
break;
Run Code Online (Sandbox Code Playgroud)