0

タブ ビューを持つアプリケーションでコア データを使用する。2 番目のタブはコア データをロードし、Xcode またはアプリを実行してもエラーは表示されませんが、2 番目のタブをクリックするとアプリがクラッシュし、「NSFetchedResultsController のインスタンスには非 nil フェッチ要求と managedObjectContext が必要です。

私はコアデータが初めてで、このエラーに本当に苦労しているので、助けていただければ幸いです。実装ファイルには次のコードがあります

- (void)setupFetchedResultsController
{
    // 1 - Decide what Entity you want
    NSString *entityName = @"EatCategory"; // Put your entity name here
    NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);

    // 2 - Request that Entity
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

    // 3 - Filter it if you want
    //request.predicate = [NSPredicate predicateWithFormat:@"EatCategory.name = Blah"];

    // 4 - Sort it if you want
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name"
                                                                                     ascending:YES
                                                                                      selector:@selector(localizedCaseInsensitiveCompare:)]];
    // 5 - Fetch it
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];
    [self performFetch];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self setupFetchedResultsController];

    if ([[self.fetchedResultsController fetchedObjects] count] == 0) {
        NSLog(@"No Results were fetched so nothing will be given to the table view");
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Eat Category Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    }

    // configure the cell...
    EatCategory *eatcategory = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = eatcategory.name;

    return cell;
}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [self.tableView beginUpdates]; // Avoid  NSInternalInconsistencyException

        // Delete the role object that was swiped
        EatCategory *eatCategoryToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
        NSLog(@"Deleting (%@)", eatCategoryToDelete.name);
        [self.managedObjectContext deleteObject:eatCategoryToDelete];
        [self.managedObjectContext save:nil];

        // Delete the (now empty) row on the table
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self performFetch];

        [self.tableView endUpdates];
    }
}
4

1 に答える 1

1

管理対象オブジェクトのコンテキストを正しく設定していますか? fetch リクエストは問題ないようですが、コンテキストはどうでしょうか。コンテキストが正しく設定されていないと、そのエラーが発生する可能性があります。

外部オブジェクトからコンテキストを注入しますか? はいの場合、managedObjectContextプロパティはどのように宣言されていますか?

例えば:

// from an external object
YourController *controller = ... // alloc-init the controller
controller.managedObjectContext = self.managedObjectContext;

// within your controller .h
@property (strong, nonatomic) NSManagedObject* managedObjectContext; // or retain if you don't use ARC

// within your controller .m
@synthesize managedObjectContext;

次のように、アプリケーションデリゲートからコントローラー内のメインコンテキストを取得することもできます (そこで宣言した場合)。

AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext* managedObjectContext = delegate.managedObjectContext;

しかし、これはより厳密なアプリケーション設計につながる可能性があります。

いくつかのメモ

使用する代わりに、コールバックcommitEditingStyleを「登録」できNSFetchedResultsControllerDelegateます。このクラスは、テーブル ビューの変更を処理するために作成されました。それを使用して、テーブルの変更に対して異なる方法で応答できます。

ここにNSFetchedResultsControllerDelegateのクラス参照があります。

それが役に立てば幸い。

于 2012-05-06T14:45:29.267 に答える