我的表格视图显示了一个用户列表。添加用户后,我在刷新表格视图时遇到问题。我尝试了不同的代码和事件组合,现在应用程序在endUpdates调用时崩溃了。该应用程序是在配方应用程序之后建模的,因此用户单击添加按钮,然后会出现一个模态窗口,询问用户名称。然后它进入编辑屏幕,然后返回用户列表。此时,新用户没有显示出来。但是,如果我导航回主屏幕,然后返回用户屏幕,则会出现用户。
以下是我的一些代码:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
sectionInsertCount = 0;
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) {
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
sectionInsertCount++;
}
break;
case NSFetchedResultsChangeDelete:
if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1) )) {
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
sectionInsertCount--;
}
break;
case NSFetchedResultsChangeMove:
break;
case NSFetchedResultsChangeUpdate:
break;
default:
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
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];
}
case NSFetchedResultsChangeMove:
if (newIndexPath != nil) {
NSUInteger tableSectionCount = [self.tableView numberOfSections];
NSUInteger frcSectionCount = [[controller sections] count];
if (frcSectionCount != tableSectionCount + sectionInsertCount) {
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:[newIndexPath section]] withRowAnimation:UITableViewRowAnimationNone];
sectionInsertCount++;
}
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject:newIndexPath]
withRowAnimation: UITableViewRowAnimationRight];
runEndUpdates = NO;
}
else {
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade];
}
break;
default:
break;
}
}
我几乎处于一个突破点。 CoreData一直是应用程序开发中最令人沮丧的部分。我应该切换到SQL Lite吗?或者我还会遇到同样的问题吗?
谢谢!
答案 0 :(得分:5)
根据我的经验,它必须在beginUpdated和endUpdated之间插入或删除一些行或部分。如果在beginUpdated和endUpdated之间没有插入或删除行或部分,它将崩溃。
并且,如果节号和行号不正确,它也会崩溃。 所以,它需要非常仔细地编码。
答案 1 :(得分:2)
今天我遇到了同样的问题。
问题出在我的源代码中 - 其中一个UITableViewDataSource函数使用了无效对象(不是CoreData对象,简单数组,我忘了保留),这导致崩溃。不幸的是,调用堆栈中并不清楚,控制台中没有提供任何消息。
所以原因可能在于你的UITableViewDataSource协议的实现。
答案 2 :(得分:2)
我在同一个地方看到了一次撞车事故,但出于不同的原因。我也会看到这种奇怪的行为,表格视图滚动会慢慢爬行,并且基本上没有响应。这背后的原因最终变得有点整洁有趣,所以我想我会分享它。
我的表视图有一堆按日期排序的事件。一次从Web API 50查询事件。每次进行新的查询时,获取的结果都会更新并且新的单元格会被动画化。早期我注意到在添加新行时会发生很多奇怪的移动,但它似乎稍后会进行优化。
可以保存应用中的事件,并且表格视图可以在所有事件和已保存事件之间进行过滤。有一次我只是点击过滤器在所有事件和保存的事件之间来回切换,我注意到在我切换回所有事件视图的特定日子里,它们将被重新排列。
哦,对不起,我还需要一个开始时间的描述符。这将使应用程序更好用。OH DUH!我打赌这就是它崩溃的原因!由于每次更新基本上都会导致每个现有行都移动到一个新位置,再添加额外的行,我必须刚刚在表视图控制器中遇到一些崩溃错误。现在滚动问题已经消失,崩溃也消失了。
获得的经验教训:确保获取的结果控制器具有足够的排序描述符,以便结果在重新加载视图时具有决定性。
答案 3 :(得分:-3)
尝试在controllerDidChangeContent中调用[self.tableview reloaddata]
。