【问题标题】:tableview reloadData doesnt work - TableView Data are not correctly sortedtableview reloadData 不起作用 - TableView 数据未正确排序
【发布时间】:2012-01-16 12:16:28
【问题描述】:

我有一个具有开启和关闭模式的应用程序。 在在线模式下,我正在检查服务器的登录,
下载 XML 文件并解析该文件。所有数据都写入 coreData。

我正在使用 NSFetchedResultsController 填充我的 TableView。

如果我使用 Off 模式(要使用 Offline 模式,coreData 实体不应为 nil),
我只是关闭视图以使用 coreData 中的数据显示 tableView。

这里的问题是:如果我使用离线模式,数据排序不正确。
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 上对 tableview 进行排序?

编辑 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;
}    

【问题讨论】:

  • 能否请您发布一些相关代码。我也有类似的问题,也许我们可以一起解决。
  • 您认为我应该发布什么?我不知道与她有什么关系。我想,这里的代码没有错误,我只是不知道我必须做什么。可能会做一个新的 nssort 并在 viewDidAppear 上再次获取?

标签: uitableview core-data datasource nsfetchedresultscontroller reloaddata


【解决方案1】:

存储在数据库中的数据默认不排序。您有责任对其进行分类。根据您的数据结构,您可以添加索引以帮助排序,也可以按一些逻辑值(例如名称、lastSeenDate 等)进行排序。

发布从 Core Data 检索数据的代码(可能是您的 NSFetchedResultsController 的创建)。

对 OP 1 的回应

您真的不想在NSFetchedResultsController 之外进行排序,因为这涉及大量的工作和真正不必要的代码。您应该配置NSFetchedResultsController 以按照您将在屏幕上显示的方式进行排序。真的没有理由做两次。排序是非破坏性和非持久性的。

但是,如果您绝对必须排序两次,那么您需要:

  1. 通过-fetchedObjects-sections 然后-objectAtIndex: 然后-objects 收集对象数组以获取一个部分的数组。
  2. 有了数组,您可以调用-sortedArrayUsingDescriptors: 来生成最终排序。

正如我所说,你真的不想这样做。您需要在与代码中的 NSFetchedResultsController 交互的每一点都执行此操作,典型的 UITableViewController 大约是 5 点。零值的许多额外代码。

您还有一个问题:您是否使用NSFetchedResultsController 来显示单元格的数据?可以发一下-tableView: cellForRowAtIndexPath:吗?

【讨论】:

  • 您好马库斯,感谢您的回答。我已经发布了我的 nsfetchedresultscontroller,请参阅我的 Edit 2。你能告诉我,如何在 nsfetchedresultscontroller 之外进行排序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2022-06-14
相关资源
最近更新 更多