2011-12-29 2 views
3

Я довольно озадачен, почему reloadData не перезагружает tableview. Это не вызывает numberOfRowsInSection ...UITableView reloadData не перезагружается

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 

Tableview (aTableView) не ноль перед вызовом reloadData

2011-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}> 

Как только я перезапустить приложение он показывает новое содержание ... Я использую раскадровку и сделал все связи между Tableview и делегатом/источником данных и проверил это несколько раз. Класс - это 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]; 
} 

Не знаете, в чем проблема здесь? Любые идеи?

Edit:

Я lazyloading 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]; 
... 

Найдено еще одну проблему. После сохранения данных и возврата к представлению таблицы при попытке прокрутки отображаются только белые ячейки. Он также не перезагружает старые ячейки.

enter image description here

+0

Вы пытались вызвать 'reloadData' в' viewDidAppear'? – dasdom

+0

да я сделал ... без изменений – Chris

ответ

5

OK! Я нашел проблему. Вместо reloadData я использовал beginUpdates и endUpdates. Большое спасибо за вашу помощь! Я получил информацию от NSFetchedResultsControllerDelegate Reference

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView endUpdates]; 
} 
+0

Работайте как очарование .... – Siten

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]; 
+0

fetschedResultsController не ноль, поскольку он становится ленивым загруженным – Chris

1

Если таблица показывает правильные данные при перезапуске приложения, то ваши DataSource и делегат метода Tableview является правильной. Вы отмечаете, что проблема возникает после добавления новых данных (т. Е. Сохранения managedObjectContext). Если это так, то проблема заключается в обработке методов делегатов NSFetchedResultsController.

Попробуйте добавить следующее:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.aTableView reloadData]; 
} 

Если для устранения проблемы, вы можете анимировать изменения таблицы против перезагрузки всей таблицы. В документах NSFetchedResultsController есть ясный пример того, как это сделать.

+0

controllerDidChangeContent вызывается, но он не вносит никаких изменений в таблицу. – Chris

+0

Вам нужно будет написать больше кода. Единственное, что вы сомневаетесь в том, что проблема заключается в том, что данные сохранены и что 'numberOfSectionsInTableView' не вызывается. Это обычно означает, что либо вы не перезагружаете таблицу в нужное время, либо у вас есть ошибка в методах dataView источника tableView. – XJones

+0

данные сохраняются в другом контроллере. Какой код вам нужно будет видеть? – Chris

0

Если добавленные данные отображаются после перезагрузки приложения, я бы предположил, что в вашем коде отсутствует шаг добавления новых данных в массив, который предоставляется следующему методу.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

Чтобы уточнить, СФО с 171 объектов должен передать эту информацию на массив, который будет использоваться для перезагрузки UITableView.

+0

Я добавил свой cellForRowAtIndexPath к предыдущему вопросу. Данные извлекаются непосредственно из FRC. Но он не вызван после того, как я сделаю reloadData. – Chris

Смежные вопросы