0

2つのテーブルビューコントローラーにコアデータを実装しています。最初の表示銀行名、都市と州、2番目の表示銀行の詳細情報(zip、終了日など)。したがって、モデルには2つのエンティティがあります。1つ目は「BankInfo」、2つ目は「BankDetails」と呼ばれます。2つのエンティティは1対1の関係にあります。

最初のコントローラーから2番目のコントローラーにセグエするときに問題が発生します。2番目のテーブルビューコントローラでフェッチされたオブジェクトの数は常にゼロのようです。これは、FRCが何もフェッチしないことを意味します。何が問題なのですか?

最初のテーブルは正常に機能しています。そして、2番目のエンティティはデータで適切に満たされていると確信しています。そして、述語を削除しようとしました。その場合、FRCはエンティティ内のすべてのオブジェクトを返す必要があります。しかし、それでも何も返されません。

#import "SecondViewController.h"
#import "AppDelegate.h"

@interface SecondViewController () <NSFetchedResultsControllerDelegate>
@property (nonatomic,strong) NSFetchedResultsController *fetchedResultsController;
@end

@implementation SecondViewController
@synthesize bankInfo = _bankInfo;
@synthesize fetchedResultsController = _fetchedResultsController;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.fetchedResultsController.delegate = self;

    NSError *error;

    if (![self.fetchedResultsController performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    [self.tableView reloadData];

    NSLog(@"Frist fetched object is %@",[[self.fetchedResultsController fetchedObjects] objectAtIndex:0]);
}


- (void)setBankInfo:(BankInfo *)bankInfo
{
    _bankInfo = bankInfo;
}

- (NSFetchedResultsController *)fetchedResultsController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"BankDetails"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.state = %@",self.bankInfo.state];
    [request setPredicate:predicate];

    [request setSortDescriptors: [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"zip"
                                                                                    ascending:YES
                                                                                     ]]];
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = appDelegate.managedObjectContext;

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

    return _fetchedResultsController;
}
// FRC delegate methods...
@end
4

1 に答える 1

2

getter関数fetchedResultsControllerは、呼び出されるたびに新しいFRCを作成します。

だからあなたが電話するとき

[[self.fetchedResultsController fetchedObjects] objectAtIndex:0]

次にfetchedResultsControllerが呼び出され、新しいFRCが作成され、に格納されて_fetchedResultsController、新しいFRCが返されます。performFetchこの新しいFRCで呼び出されたことがないため、fetchedObjects空です。また、デリゲートは新しいFRCに設定されていません。

同じことがおそらくテーブルビューデリゲートメソッドでも起こります。

fetchedResultsControllerこのメソッドにブレークポイントを設定するかNSLog()、そのメソッドにブレークポイントを追加することで、これが問題であるかどうかを簡単に確認できます。

あなたがおそらくやりたかったのは、怠惰なゲッター関数です。デリゲートを設定し、そのメソッドでフェッチを実行することも理にかなっています。

- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController == nil) {
        /* ... create request, predicate, sort descriptor ... */
        _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
        _fetchedResultsController.delegate = self;
        [_fetchedResultsController performFetch:&error]; // error handling omitted
    }
    return _fetchedResultsController;
}

検索条件が変更された場合_fetchedResultsController = nilは、新しいFRCの作成を強制するように設定しただけです。

于 2012-09-24T05:04:16.563 に答える