我有一个带有自定义单元格的 UITableView,其中包含另一个 UItableView。我需要传递一个对象给它,然后基于这个对象执行一个fetchrequest。
从我的 cellForRowAtIndexPath 方法中,我将托管对象传递给自定义单元格,如下所示:
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;
这样,我应该能够从我的自定义 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 来执行获取请求。希望找到在我对托管对象的引用的实际设置之前执行 fetchRequest 的情况。所以我点击它,执行提取。没事了!没有任何行。
编辑: 但是,下面的 NSLogs 会从我的 fetchResultsController 内部返回一个对象,然后使用支持的 UIBUtton 和 IBAction。但仍然没有行!
NSLog(@"_viewingDay: %@", _viewingDay);
NSLog(@"_viewingDay.clocks: %@", _viewingDay.clocks);
支持 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) 会返回所有时钟。确认我的 resultsController 设置正确。我的谓词可能有问题......我不明白是什么。我在以前的控制器中有一个类似的谓词并且效果很好。
谓词很简单,没什么花哨的:
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"day == %@", _viewingDay]];
我有一个时钟和日期实体。
一天有很多时钟。1对多关系。
时钟有一天,也只有一天。
上面的 fetchRequest 应该已经返回了当天的所有时钟。但不是吗?