使用StoryBoard时传递NSManagedObjectContext引用

Cry*_*tal 0 iphone core-data uistoryboard

我正在查看Pro Core Data示例,我想知道传递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;
}
Run Code Online (Sandbox Code Playgroud)

然后,当从表行选择中将新的ViewController压入堆栈时,这样做:

NSManagedObject *team = [[self fetchedResultsController] objectAtIndexPath:indexPath];
  TeamViewController *teamViewController = [[TeamViewController alloc] initWithMasterController:self team:team];
  [self presentModalViewController:teamViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

使用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"];
        }
Run Code Online (Sandbox Code Playgroud)

我无法想出一个很好的方法来保持我的类解耦,并在我的viewControllers中引用managedObjectContext.我是否在我需要查看的所有视图控制器上设置了一个managedObjectContext?我是否按照第一个示例中的作者执行的操作并保留对具有引用的MasterViewController的引用,并将其传递给我的不同ViewControllers?我不确定这样的事情的"最佳实践"是什么.谢谢!

zpa*_*ack 5

prepareForSegue:sender:确实是使用故事板时将数据从一个视图控制器传递到另一个视图控制器的首选方法.您发布的示例prepareForSegue代码正是您执行此操作的方式.我的一个应用程序中有这个代码:

- (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"];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您还没有看到,去年WWDC故事板会议很好看.