Ios 核心数据:如何将托管对象传递到UITableViewCell并从那里执行fetchRequest?

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

我有一个自定义单元格的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;
这样,我应该能够从我的自定义单元格基于此对象执行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]];