UITableView 加载核心数据的问题

Posted

技术标签:

【中文标题】UITableView 加载核心数据的问题【英文标题】:Issues with UITableView loading Core Data 【发布时间】:2014-03-15 07:19:24 【问题描述】:

我正在开发一个应用程序,该应用程序正在下载一堆 JSON 信息,然后将其呈现在 UITableView 中,使用 Core Data 来存储所有信息。我目前在 tableView 中加载元素时遇到问题 - 每当我滚动时(我玩过不同的行高,没有区别)我可以看到 nameLabel 属性,如下面的代码中的变化在我眼前不应在该行中表示的名称。

在我的其他单元格中有图像的视图中,同样的事情发生了,图像不断变得混乱。此外,tableView 甚至不显示数据(即在那里,等待),直到我触摸它并滚动。这是我的代码:

    - (void)viewWillAppear:(BOOL)animated

    self.managedObjectContext = [Pro downloadStoreData];


- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext

    _managedObjectContext = managedObjectContext;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Pro"];

    request.predicate = nil;
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:NO]];

                                self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];


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

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Pro Cell"];

    Pro *pro = [self.fetchedResultsController objectAtIndexPath:indexPath];

    UIImageView *proImageView = (UIImageView *)[self.view viewWithTag:1];
    UILabel *nameLabel = (UILabel *)[self.view viewWithTag:2];
    UILabel *ageLabel = (UILabel *)[self.view viewWithTag:3];
    UILabel *yearsLabel = (UILabel *)[self.view viewWithTag:4];
    UILabel *locationLabel = (UILabel *)[self.view viewWithTag:5];

    nameLabel.font = [UIFont fontWithName:@"Museo Slab" size:18.0f];
    nameLabel.text = pro.title;
    //[cell setNeedsDisplay];
    //NSLog(@"%@", pro.title);



    return cell;

如您所见,我在另一个课程中开始下载,然后设置上下文并使用 NSFetchedResultsController 获取信息。

我尝试了[cell setNeedsDisplay][self.tableView reloadData] 的组合,但它不会改变效果。

我确实有一个 UITableView 可以正常工作,但我不知道是什么让它与众不同。

谢谢

【问题讨论】:

【参考方案1】:

您应该在您的fetchedResultsController 上调用performFetch: 方法,然后重新加载您的tableView

NSError *error = nil;
[self.fetchedResultsController performFetch:&error];
[self.tableView reloadData];

看起来您的downloadStoreData 是一个同步方法,因此应该适合您,但如果您异步获取数据,请考虑将您的viewController 设置为fetchedResultsController 的代表。

【讨论】:

对不起,我应该提到 - 我正在使用的 TableView 是 TableView 的子类,已经可以使用 Core Data,所以一旦我设置了fetchedResultsController,它就会自动调用performFetch 和@ 987654330@。我还尝试让控制器成为委托,但仍然没有运气 - 滚动/加载时的结果相同。 尝试拨打[self.fetchedResultsController fetchedObjects]。有吗? 是的,我可以使用NSLog 来查找获取的对象的任何属性,并且返回的数组显然不是 nil,因为它返回值。【参考方案2】:

我知道我的问题是什么 - 我在打电话

(UIImageView *)[self.view viewWithTag:1];

而不是

(UIImageView *)[cell viewWithTag:1];

所以我认为视图将所有不同的 UI 对象与不同的单元格混合在一起,并且通常会感到困惑。

我希望这对某人有帮助!

【讨论】:

以上是关于UITableView 加载核心数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 上的 UITableView 上指示加载活动的正确方法是啥?

UItableview 不刷新核心数据中的更新数据

FMDB 和 UITableView

UITableviewcell 是错误的数据

CoreData:在返回 UITableView 之前重新加载数据

使用 nsfetchedresultscontroller 时,未在 uitableview 中自动重新加载数据