3

エンティティ「顧客」と属性「名前」を使用して、単純な Core Data プロジェクトをテストしています。マスター詳細テンプレートの修正版を使用しています。マスターには名前のテーブルビューが含まれ、詳細は名前を入力するために使用されます。

Master の prepareForSegue では、Details の Customer オブジェクトを次のように設定します。

...
else if ([segue.identifier isEqualToString:@"Add Customer"]) {
    [[segue destinationViewController] setDelegate:self];
    [[segue destinationViewController] setCust:(Customer *) [NSEntityDescription insertNewObjectForEntityForName:@"Customer"inManagedObjectContext:self.managedObjectContext]];
}

マスターの insertNewObject は一般名を追加します。

...
[newManagedObject setValue:sender forKey:@"name"];
...

詳細では、名前はデリゲートを介して追加されます。

- (IBAction)save:(UIBarButtonItem *)sender {
self.cust.name = self.customerName.text;
[self.delegate addNameController:self selectedSave:YES];  

マスターの委任方法:

- (void)addNameController:(AddNameController *)controller selectedSave:(BOOL)save {
if (!save) {
    [self.managedObjectContext deleteObject:controller.cust];
}
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
[self dismissViewControllerAnimated:YES completion:nil];}

これはすべて正常に機能し、ソートに関して最初のエントリになるエントリを除いて、すべての新しい名前エントリに対してテーブルビューが適切に更新されます。その場合、名前データベースに追加されますが、テーブルビューの最初の行に空白のエントリが配置されます。[編集] ボタンをタップするか、非表示の名前の前に並べ替えて新しい名前を追加することで、名前を表示できます。

この問題を回避するために、Master で強制的にリロードしました。

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];}

これは私にはちょっとしたハックのように思えます。Core Data がコンテンツの変更に応じて表示を適切に更新することを理解していました。

これを実装する方法に問題がありますか、それとも Core Data の特異性ですか?

ありがとう。

4

1 に答える 1

1

実際には、NSFetchedResultsController delegateこれを行う場所にリンクされたメソッドがない限り、テーブルを明示的に更新する必要があります。(デリゲート メソッドは になりますcontrollerDidChangeContent:。)

より便利で明白な方法は、詳細ビューを閉じるときに、マスターのデリゲート コールバックで正しく行うことです。これは「ハック」ではありません。

于 2012-06-08T23:39:14.760 に答える