別の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 は、サポートする UIBUtton と IBAction を使用して、fetchResultsController 内からオブジェクトを返します。しかし、まだ行はありません!
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 は、その日のすべてのクロックを返しているはずです。しかし、そうではありませんか?