2017-02-19 3 views
1

Я использую NSFetchedResultsController в моем представлении таблицы, и он отлично работает. Моя проблема заключается в том, что я хочу создать «no data view», когда _fetchedResultsController имеет 0 строк.Нет просмотра данных в таблицеView с использованием NSFetchedResultsController

Я пытался создать его в моем numberOfSectionsInTableView: как этот

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    if ([[_fetchedResultController.sections firstObject] numberOfObjects] == 0) { 
     MyNoDataView *view = [[MyNoDataView alloc] initWithFrame:tableView.frame]; 
     tableView.backgroundView = view; 
     tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 
     return 0; 
    } 
    else { 
     tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
     tableView.backgroundView = nil; 
     return 1; 
    } 
} 

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

Проблема возникает, когда я делаю удаление в своей строке. Технически, я просто обновить свои свойства объекта (isActive) моим fetchRequest в fetchedResultController с помощью этого NSPredicate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isActive == %@ ", @YES]; 
[fetchRequest setPredicate:predicate]; 

Тогда, если есть только одна строка, и я удалить его, я получаю эту ошибку

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView internal bug: unable to generate a new section map with old section count: 1 and new section count: 0' 

Так что я попытался удалить мой numberOfSectionsInTableView:, и вдруг эта ошибка исчезла. Я понятия не имею, что здесь происходит, но я думаю, что ошибка в моем условном случае на numberOfSectionsInTableView:.

Любая помощь будет оценена по достоинству. Спасибо огромное!

+0

Проверьте дубликат. Вам необходимо обработать это в методах делегатов NSFetchedResultsController. NSFetchedResultsController «не знает», если вы добавляете пользовательские ячейки и разделы. Он просто предоставляет свои собственные данные и вставляет ячейки и разделы из собственной учетной записи, и если у вас уже есть ячейки и разделы, то цифры не добавляют upp правильно, и вы будете терпеть крах. Кроме того, ** sidenote ** Почему вы даже выделяете «MyNoDataView» и устанавливаете стили seperator в numberOfSectionsInTableView? Это действительно очень плохая практика. –

+0

** EDIT ** Я удалил дубликат. Предоставьте больше кода о том, как вы обрабатываете вставки и удаления и т. Д. Таким образом, мы можем легче найти ошибку. Возможно, это поможет вам найти код ошибки: http://stackoverflow.com/questions/33951169/deleting-the-last-section-of-a-uitableview-causes-an-exception и https: //forums.developer .apple.com/thread/9964 –

+0

Я просто хочу создать не просмотр данных tbh. Итак, как вы думаете, я должен выделить MyNoDataView и поместить его в качестве фона таблицы? Заранее спасибо. –

ответ

1

решаемые

На основе Sneak «s ответ, выделяя "MyNoDataView" и настройки seperatorstyles в numberOfSectionsInTableView действительно очень плохая практика. Итак, я закончил с изменением моего controllerDidChangeContent: на выбранном делете контроллера результата

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
    if ([controller.fetchedObjects count]) { 
     self.tableView.backgroundView = nil; 
    } 
    else { 
     MyDataView *view = [[MyDataView alloc] initWithFrame:self.tableView.frame]; 
     self.tableView.backgroundView = view; 
    } 

    [self.tableView endUpdates]; 
} 
+0

Спасибо за публикацию решения. У меня также была проблема подобного характера. Исправлено. –

+0

@ sweta.me рад это слышать! –

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