0

私はProCoreDataの例を見ていましたが、ManagedObjectContextを渡すための良い方法は何であるか疑問に思いました。この本の例では、作成者がAppDelegateでManagedObjectContextを初期化してから、MasterViewControllerでこれを実行しているのがわかります。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    self.title = NSLocalizedString(@"League Manager", @"League Manager");
    id delegate = [[UIApplication sharedApplication] delegate];
    self.managedObjectContext = [delegate managedObjectContext];
    }
    return self;
}

次に、新しいViewControllerがテーブル行の選択からスタックにプッシュされると、これが実行されます。

NSManagedObject *team = [[self fetchedResultsController] objectAtIndexPath:indexPath];
  TeamViewController *teamViewController = [[TeamViewController alloc] initWithMasterController:self team:team];
  [self presentModalViewController:teamViewController animated:YES];

StoryBoardsを使用すると、そのタイプのinitメソッドは表示されなくなります。私はprepareForSegueが主に使用されているのを見て、Beginning iOS 5 Developmentの本を見ると、作者は次のようなことをするでしょう。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        UIViewController *destination = ((UINavigationController *)segue.destinationViewController).topViewController;

        if ([destination  respondsToSelector:@selector(setDelegate:)]) {
            [destination setValue:self forKey:@"delegate"];
        }

クラスを分離して、viewControllersにmanagedObjectContextへの参照を持たせるための良い方法を理解できません。それを表示する必要があるすべてのビューコントローラーに設定したmanagedObjectContextがありますか?最初の例の作成者が行ったことを実行し、参照を持つMasterViewControllerへの参照を保持して、それを別のViewControllerに渡しますか?このようなものの「ベストプラクティス」が何であるかはわかりません。ありがとう!

4

1 に答える 1

5

prepareForSegue:sender:ストーリーボードを使用するときに、あるビュー コントローラーから別のビュー コントローラーにデータを渡すには、実際に推奨される方法です。あなたが投稿した prepareForSegue コードの例は、まさにあなたがそれを行う方法です。私のアプリの1つにまさにこのコードがあります:

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if( [[segue identifier] isEqualToString:@"showLog"] ) {
        UIViewController* logView = segue.destinationViewController;
        if( [logView respondsToSelector:@selector(setManagedObjectContext:)] ) {
            [logView setValue:self.managedObjectContext forKey:@"managedObjectContext"];
        }
    }
}

昨年の WWDC のストーリーボード セッションは、まだご覧になっていない方におすすめです。

于 2012-06-19T05:25:03.213 に答える