tableView reloadData 不起作用

Posted

技术标签:

【中文标题】tableView reloadData 不起作用【英文标题】:tableView reloadData does not work 【发布时间】:2011-12-08 20:41:42 【问题描述】:

我在标签栏应用程序中有一个表格视图。

我正在加载viewDidLoad中的数据

managedObjectContext = nil;
managedObjectContext = [(RecipesAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"BrilliantMustache" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"badge.length > 0"];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"badge" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"badge" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor1 release];
[sortDescriptor2 release];
[sortDescriptors release];

我正在尝试重新加载viewWillAppear中的数据

- (void)viewWillAppear:(BOOL)animated 
    [self.tableView reloadData];

在这个视图中,我调用了另一个视图,它在更改时会在发布时更新核心数据。当我导航回 tableview 时,它不会更新。它会更新的唯一方法是,如果我退出应用程序并从头开始重新加载。

总共有 2 个单独的表格视图。奇怪的是,第一个 tableview 确实刷新了。

有什么想法吗? 抢

【问题讨论】:

您是否尝试在 viewDidAppear 中重新加载? 【参考方案1】:

你需要在viewDidLoad 中做你在viewWillAppear 中所做的事情。 viewDidLoad 仅在启动时调用,因此尽管更改了数据,但您的视图永远不会更改自己的本地数据,因此当您调用 reloadData 时,它仍然使用旧数据。

编辑:

你应该拥有的:

- (void)viewWillAppear:(BOOL)animated 
    managedObjectContext = nil;
    managedObjectContext = [(RecipesAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"BrilliantMustache" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"badge.length > 0"];
    [fetchRequest setPredicate:predicate];
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"badge" ascending:YES];
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"badge" cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;
    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor1 release];
    [sortDescriptor2 release];
    [sortDescriptors release];

    [self.tableView reloadData];
    [super viewWillAppear:animated];


- (void)viewDidLoad:(BOOL)animated 
    [super viewDidLoad:animated];

【讨论】:

见上面的代码,- (void)viewWillAppear:(BOOL)animated [self.tableView reloadData]; 它在viewWillAppear中被调用 reloadData 只是告诉表视图根据您在表视图数据源和委托中提供的数据刷新表。问题是,尽管您告诉表视图重新加载数据,但它从中加载的数据已经过时了。 好吧,这是有道理的,但鉴于我正在视图中加载数据,您能否告诉我如何刷新数据,而不像上面那样重新加载数据?还是我需要从头开始重新加载数据?谢谢!有没有办法强制重新加载整个视图? 好吧,与其把你所有的核心数据代码(你说的第一个代码块在viewDidLoad中)放在viewDidLoad中,我会把它放在viewWillAppear中,然后是你的@ 987654332@. 请记住 -performFetch: 可能是一项潜在的昂贵操作,您可能不希望每次出现视图时都发生这种操作,因为需要访问磁盘。【参考方案2】:

您是否正确实施了NSFetchedResultsControllerDelegate 方法?当 FRC 收到来自托管对象上下文的更改通知时,它应该处理更新表...

编辑: NSFetchedResultsController Class Reference

【讨论】:

你的意思是:@interface PickerViewController : UIViewController <NSFetchedResultsControllerDelegate, UIScrollViewDelegate, UIPickerViewDelegate> etc...? 这只是声明 PickerViewController 符合 NSFetchedResultsControllerDelegate 协议。有 4 种方法可以实现完整的更改跟踪。 -controllerWillChangeContent:-controllerDidChangeContent: 等。我已经用指向类参考的链接更新了我的答案。 所以如果我在另一个视图中更改了一个字段并返回到我想要更新的视图,这会触发didChangeObject?生病看看文档,看看我可以在这里使用什么,谢谢!

以上是关于tableView reloadData 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

tableView reloadData 不起作用

tableView.reloadData() 不起作用,可能没有在主线程上调用

UITableView 的 ReloadData 不起作用;登录时 tableView 返回 NULL

tableview.reloaddata() 在使用 coredata 时搜索栏取消按钮后不起作用

在AFNetworking中成功调用后self.tableView reloadData不起作用

在AFNetworking中成功调用后self.tableView reloadData不起作用