1

我有一个带有自定义单元格的 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 应该已经返回了当天的所有时钟。但不是吗?

4

1 回答 1

1

1) awakeFromNib 在您实例化单元格时执行,因此在您设置查看日期之前执行。如果重复使用单元格,它也不会执行,因此您应该单独触发获取请求。

2) 如何设置单元格内的 fetchedResultsController 属性?

编辑1:

从数据模型和谓词来看,时钟和日期之间的关系似乎没有正确设置。

编辑2:

从下面引用提问者的评论:“在我的覆盖设置器中插入 [self fetchRequest] 后,问题得到了解决。”

于 2013-07-29T16:40:25.290 回答