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 は、サポートする 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 は、その日のすべてのクロックを返しているはずです。しかし、そうではありませんか?

4

1 に答える 1

1

1) awakeFromNib は、セルをインスタンス化した瞬間、つまり表示日を設定する前に実行されます。また、セルが再利用された場合も実行されないため、フェッチ リクエストを個別にトリガーする必要があります。

2) セル内の fetchedResultsController プロパティはどのように設定されますか?

編集1:

データモデルと述語から、時計と日の関係が正しく設定されていないように見えます。

編集2:

以下から質問者のコメントを引用します。

于 2013-07-29T16:40:25.290 に答える