3

私の人生では、基礎となるデータストアにデータを追加するときに NSFetchedResultsControllerDelegate メソッドが起動しない理由がわかりません。iPhone アプリケーションを再起動すると、すぐにデータが表示されます。

UITableViewController をサブクラス化し、NSFetchedResultsControllerDelegate に準拠しています。

@interface ProjectListViewController : UITableViewController <NSFetchedResultsControllerDelegate> {
    NSFetchedResultsController* fetchedResultsController_;
    NSManagedObjectContext* managedObjectContext_;
}

NSFetchedResultsController をインスタンス化し、デリゲートを自分自身に設定します。

// Controller
fetchedResultsController_ = [[NSFetchedResultsController alloc] initWithFetchRequest:request
    managedObjectContext:self.managedObjectContext 
                                                                  sectionNameKeyPath:@"Client" 
                                                                           cacheName:@"ProjectsCache"];
fetchedResultsController_.delegate = self;

デリゲート メソッドを実装します。

- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller {
    NSLog(@"ProjectListViewController.controllerWillChangeContent");
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates.
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller { ... }
- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { ... }
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { ... }

保存したいエンティティを作成します。

Project* newProject = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:self.managedObjectContext];
ProjectDetailViewController* detail = [[ProjectDetailViewController alloc] initWithStyle:UITableViewStyleGrouped 
                                                                                delegate:self 
                                                                                selector:@selector(finishedAdding:) 
                                                                                 project:newProject];

そして後で、私はそれを保存します:

- (void)save {
    // NSLog(@"ProjectDetailViewController.save");
    self.project.name = projectNameTextField_.text; 
    NSError* error;
    BOOL b = [self.project.managedObjectContext save:&error];
    if (!b) {
        NSLog(@"Error saving project!");
    } else {
        NSLog(@"Project was successfully saved.");
        [delegate_ performSelector:selector_ withObject:self.project];
    }
    [self dismissModalViewControllerAnimated:YES];
}

デリゲート メソッドが起動しないという事実を除いて、すべて正常に動作します。明らかに、私のテーブル ビューは更新されず、新しいデータを表示する唯一の方法は、アプリを明示的に更新または再起動することです。

CoreData Recipe アプリを調べましたが、不足しているものを見つけることができないようです。考え?

-ルター

4

2 に答える 2

3

sectionNameKeyPath元の を作成するときに @"Client" を nilに変更すると、エンティティの作成保存fetchedResultsController_の両方でデリゲート メソッドが実際に呼び出されます。Project

fetchedResultsController_ = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                        managedObjectContext:self.managedObjectContext 
                                          sectionNameKeyPath:nil
                                                   cacheName:@"ProjectsCache"];

よく調べてみると、それが CoreData Recipes の例で行われていることです。データがより複雑になるにつれて、結果をセクションに分割するのに役立つ引数が必要になると思いますが、今のところ、デリゲート ハンドラーが呼び出されるのを見るのは良いことです。

于 2009-08-24T05:05:31.323 に答える
1

上記を読んだところ、2つのNSManagedObjectContextsを使用しているように見えます。1つはProjectListViewControllerにあり、もう1つはProjectDetailViewControllerにあります(渡されていないので、そこで作成されていると思います。

あるコンテキストを保存しても、変更は自動的に別のコンテキストに伝播されないため、ProjectDetailViewControllerに保存しても、変更はProjectListViewControllerのコンテキストに表示されません。つまり、そのコンテキストに変更がないため、デリゲートにそのことを通知できません。

コンテキスト間で変更をプッシュする場合は、NSManagedObjectContextDidSaveNotificationとmergeChangesFromContextDidSaveNotificationを参照してください(これらはNSManagedObjectContextドキュメントの最後です)。

于 2009-08-24T03:20:34.060 に答える