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 上指示加载活动的正确方法是啥?