Ios 核心数据:如何将托管对象传递到UITableViewCell并从那里执行fetchRequest?
我有一个自定义单元格的UITableView,其中包含另一个UITableView。我需要向它传递一个对象,然后基于这个对象执行一个fetchrequest 从我的cellForRowAtIndexPath方法,我将托管对象传递给自定义单元格,如下所示:Ios 核心数据:如何将托管对象传递到UITableViewCell并从那里执行fetchRequest?,ios,objective-c,uitableview,core-data,nsfetchedresultscontroller,Ios,Objective C,Uitableview,Core Data,Nsfetchedresultscontroller,我有一个自定义单元格的UITableView,其中包含另一个UITableView。我需要向它传递一个对象,然后基于这个对象执行一个fetchrequest 从我的cellForRowAtIndexPath方法,我将托管对象传递给自定义单元格,如下所示: TWHistoryViewStandardExpendedCell *cell = (TWHistoryViewStandardExpendedCell *)[tableView dequeueReusableCellWithIdentifie
TWHistoryViewStandardExpendedCell *cell = (TWHistoryViewStandardExpendedCell *)[tableView dequeueReusableCellWithIdentifier:ExpandedCell];
if (cell == nil) {
cell = (TWHistoryViewStandardExpendedCell *)[[[NSBundle mainBundle] loadNibNamed:@"HistoryViewStandardCellExpanded" owner:self options:nil] objectAtIndex:0];
}
Day *aDay = (Day *)[_fetchedResultsController objectAtIndexPath:indexPath];
[cell setViewingDay: aDay]; // NSLog here returns the expected object! :)
return cell;
这样,我应该能够从我的自定义单元格基于此对象执行fetchRequest
在自定义UItableViewCell上,我执行以下操作:
- (void) awakeFromNib
{
[self fetchRequest];
}
- (void)fetchRequest {
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
有关我的fetchedResultsController的一些详细信息:请在注释中看到我的托管对象在此处返回null
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController) {
return _fetchedResultsController;
}
NSManagedObjectContext * managedObjectContext =
[myAppDelegate managedObjectContext];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"Clock"
inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"day == %@", _viewingDay]];
NSLog(@"_viewingDay: %@", _viewingDay); // returns null! :(
NSLog(@"_viewingDay.clocks: %@", _viewingDay.clocks); // also returns null!
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"clockIn" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
//
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
_fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
基于此,我已重写我的setViewingDay方法:
- (void)setViewingDay:(Day *)viewingDay
{
if (_viewingDay != viewingDay) {
_viewingDay = viewingDay;
NSLog(@"setViewingDay: %@", _viewingDay); // returns expected object! =)
[self fetchRequest];
}
}
但是,在此之后,我的UITableView仍然是空的。我的numberOfRowsInSection方法一直返回0
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section];
NSLog(@"numberOfRowsInSection %d", [sectionInfo numberOfObjects]);
return [sectionInfo numberOfObjects];
}
支持UIButton执行提取:
- (IBAction)fetchem:(UIButton *)sender {
[_clocksTableView reloadData];
_fetchedResultsController = nil;
[NSFetchedResultsController deleteCacheWithName:nil];
[self fetchRequest];
NSLog(@"\n\nfetchem: %@ \n\nvd: %@ \n\nclocks: %@ ", _fetchedResultsController.description, _viewingDay.description, _viewingDay.clocks.description );
}
有什么我可能遗漏的吗
谢谢大家!
编辑2:
我刚刚意识到,将谓词设置为(1==1),将返回所有时钟。确认我的结果控制器设置正确。我的谓词可能有问题。。。我不知道是什么。我在以前的控制器中有一个类似的谓词,效果很好
谓词非常简单,没有什么特别之处:
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"day == %@", _viewingDay]];
我有一个时钟和一天
一天有许多钟。一对多关系
时钟有一天,只有一天
上面的fetchRequest应该返回当天的所有时钟。但它不是?1)awakeFromNib会在您实例化单元格的那一刻执行,因此在您设置查看日期之前执行。如果单元被重用,它也不会得到execute,因此您应该单独触发fetch请求
2) 如何设置单元格内的fetchedResultsController属性
编辑1:
从数据模型和谓词来看,时钟和日期之间的关系似乎没有正确设置
编辑2:
引用提问者下面的评论:“在我覆盖的setter中插入:[self fetchRequest]后,问题得到了解决。”1)awakeFromNib会在实例化单元格时执行,因此在设置查看日期之前执行。如果单元被重用,它也不会得到execute,因此您应该单独触发fetch请求
2) 如何设置单元格内的fetchedResultsController属性
编辑1:
从数据模型和谓词来看,时钟和日期之间的关系似乎没有正确设置
编辑2:
引用提问者下面的评论:“在我的重写setter中插入:[self-fetchRequest]后,问题得到了解决。”在要求fetchedresults控制器执行蚀刻之前,您是否检查了它的设置是否正确?是的。这是一个相当简单的模型。时钟实体包含与日实体的关系。我正在获取与给定日期对象匹配的所有时钟对象。如果我的fetchedResultsController有问题,我还没有看到。在要求它执行蚀刻之前,您是否检查了fetchedresults控制器的设置是否正确?是的。这是一个相当简单的模型。时钟实体包含与日实体的关系。我正在获取与给定日期对象匹配的所有时钟对象。如果我的fetchedResultsController有问题,我还没有看到。我相信我已经修复了1)重写setter的问题。我还从setter设置了fetchedResultsController。设置我的_viewingDay属性后,我执行获取。请参阅我的代码中更新的setter。非常感谢。而且,这个单元实际上没有得到重用。它只是当用户触发一个动作时出现的一个。但是单元格中确实包含TableView。是否在设置查看日期后但在执行FetchedRequest之前重新初始化fetchedResultsController?从你发的代码我看不出来。必须在创建谓词之前设置查看日期。是的,已设置!刚刚更新了我的问题。从执行获取的“支持UIButton”中,我尝试重置我的fetchResultsController。和_viewingDay和_viewingDay.clocks按预期显示。另外,查看您的注释,我刚刚意识到将谓词设置为(1==1),将返回所有时钟。确认我的resultsController设置正确。我的谓词可能有问题。。。我不知道是什么。我在以前的控制器中有一个类似的谓词,效果很好。我已经更新了我的问题。我相信我修正了1)覆盖我的二传手的问题。我还从setter设置了fetchedResultsController。设置我的_viewingDay属性后,我执行获取。请参阅我的代码中更新的setter。非常感谢。而且,这个单元实际上没有得到重用。它只是当用户触发一个动作时出现的一个。但是单元格中确实包含TableView。是否在设置查看日期后但在执行FetchedRequest之前重新初始化fetchedResultsController?从你发的代码我看不出来。必须在创建谓词之前设置查看日期。是的,已设置!刚刚更新了我的问题。从执行获取的“支持UIButton”中,我尝试重置我的fetchResultsController。和_viewingDay和_viewingDay.clocks按预期显示。另外,查看您的注释,我刚刚意识到将谓词设置为(1==1),将返回所有时钟。确认我的resultsController设置正确。我的谓词可能有问题。。。我不知道是什么。我在以前的控制器中有一个类似的谓词,效果很好。我已经更新了我的问题。
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"day == %@", _viewingDay]];