табличное представление reloadData не работает - Данные TableView не отсортированы правильно - PullRequest
0 голосов
/ 16 января 2012

У меня есть приложение с режимом включения и выключения. В онлайн-режиме я проверяю вход на сервер
скачать XML-файл и проанализировать этот файл. Все данные записываются в coreData.

Я заполняю свой TableView с помощью NSFetchedResultsController.

Если я использую режим «Выключено» (Для использования режима «Автономно» объекты coreData не должны быть равны нулю),
я просто отклонил представление для отображения tableView с данными из coreData.

Проблема в следующем: данные не сортируются правильно, если я использую автономный режим.
reloadData не работает, я пробовал больше раз.

Как я могу отобразить tableView, чтобы я тоже правильно сортировал данные в выключенном режиме ??

Редактировать 1:

В выключенном режиме я делаю только это:

if (xmlFile) {  
    //FadeOut animation nach erfolgreichem Login
    //und removeFromSuperview
    [UIView animateWithDuration:0.8 
        animations:^{loginView.alpha = 0.0;}
        completion:^(BOOL finished){ [loginView removeFromSuperview]; }];
}  

Как мне отсортировать табличное представление в viewDidAppear?

Редактировать 2:
Вот мой NSFetchedResultsController:

#pragma mark - Fetched results controller

- (NSFetchedResultsController *)fetchedResultsController
{
    if (__fetchedResultsController != nil)
{
    return __fetchedResultsController;
}

/*
 Set up the fetched results controller.
 */
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];

// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntitySetsCards" inManagedObjectContext:self.managedObjectContext];

NSPredicate *inboxPred = [NSPredicate predicateWithFormat:@"archived == 0"];


[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
[fetchRequest setPredicate:inboxPred];


// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptorSetOrder = [[[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES] autorelease];
NSSortDescriptor *sortDescriptorColorOrder = [[[NSSortDescriptor alloc] initWithKey:@"colorOrder" ascending:YES] autorelease];
NSSortDescriptor *sortDescriptorSortOrder = [[[NSSortDescriptor alloc] initWithKey:@"sortingOrder" ascending:YES] autorelease];

NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptorSetOrder, sortDescriptorSortOrder, sortDescriptorColorOrder, nil] autorelease];

[fetchRequest setSortDescriptors:sortDescriptors];


// nil for section name key path means "no sections".
// cacheName auf nil gesetzt, da @"Root" fehler erzeugt hat (FATAL ERROR)
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"setTitle" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;


NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error])
{
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

allFetchedCards = aFetchedResultsController;
allCards = [__fetchedResultsController fetchedObjects];

return __fetchedResultsController;
}    

1 Ответ

2 голосов
/ 16 января 2012

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

Опубликовать код, извлекающий данные из Core Data (возможно,создание вашего NSFetchedResultsController).

Ответ на OP 1

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

Однако если вы абсолютно должны отсортировать дважды, вам потребуется:

  1. Собрать массив объектов либочерез -fetchedObjects или через -sections, затем -objectAtIndex:, а затем -objects, чтобы получить массив для раздела.
  2. Имея массив в руках, вы можете вызвать -sortedArrayUsingDescriptors: для получения окончательной сортировки.

Как я уже сказал, вы действительно не хотите этого делать.Вам нужно будет делать это в каждой точке, с которой вы взаимодействовали с NSFetchedResultsController в вашем коде, который в типичном UITableViewController составляет около 5 баллов.Много дополнительного кода для нулевого значения.

Дополнительный вопрос для вас: используете ли вы NSFetchedResultsController для отображения данных для ячеек?Можете ли вы опубликовать свой -tableView: cellForRowAtIndexPath:?

...