0

Core Data のテストを行っています。たとえば、navigationBar と addButton を備えた mainViewController があるとします。addButton をクリックすると、detailViewController が開きます。保存を押して新しいオブジェクトを挿入すると、detailVieController が閉じて、新しいデータが挿入されたテーブルが表示されます。それを行うには2つの異なる方法を考えることができます。

最初の方法- ManagedObjectContext を渡す 追加ボタンのアクションで、新しい detailViewController のインスタンスを作成し、それに managedObjectContext を渡します。そのため、コンテキストの保存を処理してからコントローラーをポップする detailViewController の保存ボタンになります。

これは、MainViewController の addButton によって呼び出されるメソッドです。

     -(void)addNewObject{
       DetailViewController *detVC = [DetailViewController alloc]initWhit:self.managedObjectCOntext];
       [self.navigationcontroller pushViewController:detVC animated:YES];
       }

このメソッドは、IngredientViewController の保存ボタンによって呼び出されます。

      -(void)saveObject{
       NSError *error;
        if (![self.managedObjectContext save:&error]){
         NSLog(@"Error");
         }
       }

2 番目の方法- デリゲートの使用 addButton のアクションで、DetailViewController のインスタンスを作成し、それをデリゲートとして設定します。そのため、DetailViewCOntroller の保存ボタンを押すと、データをメイン コントローラーに渡すデリゲートが呼び出されます。

これは、MainViewController の addButton によって呼び出されるメソッドです。

 (void)addNewObject{
       DetailViewController *detVC = [DetailViewController alloc]init];
       detVC.delegate = self;
       [self.navigationcontroller pushViewController:detVC animated:YES];
       }

このメソッドは、IngredientViewController の保存ボタンによって呼び出されます。

      -(void)saveObject{
       [self.delegate detailVCdidSaveObject];
       }

これは mainViewController に実装されたデリゲートです

detailVCdidSaveObject{
           NSError *error;
            if (![self.managedObjectContext save:&error]){
             NSLog(@"Error");
             }
           }

------------------------------オブジェクトの受け渡し

生データを DetailViewController に渡してそこにオブジェクトを作成するのが最善ですか、それともオブジェクトのインスタンスをそのデータの設定を処理する DetailViewController に渡すのが最善ですか?

例えば

このようにして、mainVC のオブジェクト インスタンスを 1 つの DetailVC にリンクして、その値を簡単に設定できるようにします

-(void)addObject{

    DetailViewController *detailVC =[[DetailViewController alloc]init];
    detailVC.delegate = self;

    self.object = [NSEntityDescription insertNewObjectForEntityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
    detailVC.object = self.object;
    [self.navigationController pushViewController:detailVC animated:YES];   
}

このようにして生データを渡し、detailVC にインスタンスを作成させます

-(void)addObject{
DetailViewController *detailVC =[[DetailViewController alloc]initWithName:@"objname"];
[self.navigationController pushViewController:detailVC animated:YES];   
}

これらのコードは、教育目的の単なる擬似コードです。すべての方法が機能します。どれが最も正しいと思いますか、そしてその理由を知りたいだけです。ありがとう

4

3 に答える 3

1

私は最初の 2 つの方法を使用しましたが、私の意見では、どちらも同じように有効です (個人的には委任の方が好きですが)。ただし、ナビゲーション コントローラーでキャンセルまたは戻るオプションをユーザーに与えると、3 番目の方法で問題が発生しました。その場合、作成する必要のないオブジェクトが作成されます。

于 2013-09-05T21:51:11.430 に答える
0

これは、 の完璧な使用例のように思えますNSFetchedResultsController。ANSFetchedResultsControllerは、コア データからのデータの表示を非常UITableViewに簡単にするオブジェクトです。述語の変更 (挿入、削除、更新、移動) に一致するコア データ内のオブジェクトも通知します。

したがって、私が行う方法は、 にデータを提供する をMainViewController持つことです。追加ボタンを押すと、最初の方法で行ったことが実行されます。は新しいインスタンスを作成し、それに値を設定してから を保存します。NSFetchedResultsControllerUITableViewDetailViewControllermanagedObjectContext

MainViewControllerは があるためNSFetchedResultsController、新しいオブジェクトが作成されたことを自動的に認識し、 を更新してそれUITableViewを表示できます。

NSFetchedResutsControllerドキュメントNSFetchedResutsControllerDelegateドキュメントUITableView、ほとんどの作業を行うView Controllerにコピーできるインクルードコードでそれを使用する方法を正確に示しています。

于 2013-09-05T22:02:03.173 に答える