我很困惑为什么reloadData不会重新加载tableview。它不会调用numberOfRowsInSection
...
fetchedResultsController
确实在将新数据保存到核心数据
在将新数据添加到tableview之前
2011-12-29 19:09:08:213 CaveConditions[56423:71939] FRC 170
viewWillAppear
之后并添加数据
2011-12-29 19:09:35:908 CaveConditions[56423:71939] FRC NEW 171
在调用reloadData
之前,tableView(aTableView)不是nil2011-12-29 19:18:27:334 CaveConditions[56525:71939] TableVIew: <UITableView: 0x9c12000; frame = (0 0; 320 367); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x751cbb0>; contentOffset: {0, 0}>
当我重新启动应用程序时,它会显示新内容...我正在使用Storyboard并完成了tableview和委托/数据源之间的所有连接并多次检查它。 Class是一个UIViewController。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.fetchedResultsController = nil;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:0];
NSLog(@"FRC NEW %d",[sectionInfo numberOfObjects]);
[self.aTableView reloadData];
}
不确定这里有什么问题......有什么想法吗?
修改
我懒得加载FRC
- (NSFetchedResultsController *)fetchedResultsController
{
if (!fetchedResultsController)
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
if (isNormalCell)
{
fetchRequest.entity = [NSEntityDescription entityForName:@"Condition" inManagedObjectContext:self.context];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"diveDate" ascending:NO]];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"cave = %@", cave];
} else
{
fetchRequest.entity = [NSEntityDescription entityForName:@"Condition" inManagedObjectContext:self.context];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"insertDate" ascending:NO]];
fetchRequest.returnsDistinctResults = YES;
}
fetchRequest.fetchBatchSize = 20;
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:nil];
fetchedResultsController.delegate = self;
}
return fetchedResultsController;
}
这里有一些代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier;
if (!isNormalCell)
CellIdentifier = @"conditionCellReport";
else
CellIdentifier = @"conditionCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Set up the cell...
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
Condition *condition = [fetchedResultsController objectAtIndexPath:indexPath];
ConditionCell *conCell = (ConditionCell *)cell;
// Reset cell tag which normally contains the ConditionID
conCell.tag = 0;
conCell.img.image = nil;
conCell.lineLabel.text = [condition.line valueForKey:@"line"];
conCell.flowProgress.progress = [[condition.flow valueForKey:@"flowValue"] floatValue];
conCell.percolationProgress.progress = [[condition.percolation valueForKey:@"percolationValue"] floatValue];
conCell.sedimentProgress.progress = [[condition.sediment valueForKey:@"sedimentValue"] floatValue];
conCell.visProgress.progress = [[condition.visibility valueForKey:@"visValue"] floatValue] / 25;
conCell.tag = [condition.ccId intValue];
...
发现了另一个问题。保存数据并在尝试滚动时返回到tableview只显示白色单元格..它也不会重新加载旧单元格。
答案 0 :(得分:5)
OK!我发现了这个问题。我使用的是beginUpdates和endUpdates,而不是reloadData。非常感谢您的帮助!我从NSFetchedResultsControllerDelegate Reference
获得了信息- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}
答案 1 :(得分:1)
在我看来,当控制器为零时,你尝试执行提取。我会这样试试:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.fetchedResultsController = nil;
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:0];
NSLog(@"FRC NEW %d",[sectionInfo numberOfObjects]);
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.aTableView reloadData];
答案 2 :(得分:1)
如果表在重新启动应用程序时显示正确的数据,那么tableView dataSource和委托方法是正确的。您提到添加新数据后会出现问题(即保存managedObjectContext
)。如果是这种情况,则问题在于您处理NSFetchedResultsController
委托方法。
尝试添加以下内容:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.aTableView reloadData];
}
如果这样可以解决问题,您可以为表格更改设置动画并重新加载整个表格。 NSFetchedResultsController
文档有一个明确的示例,说明如何执行此操作。
答案 3 :(得分:0)
如果在应用程序重新启动后显示添加的数据,我会假设您的代码缺少将新数据添加到提供给以下方法的数组的步骤。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
为了澄清,带有171个对象的FRC应该将该信息传递给将用于重新加载UITableView的数组。