0

我正在查看 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;
}

然后,当一个新的 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 代码正是您的做法。我的一个应用程序中正好有这段代码:

- (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的Storyboard 会议很值得一看,如果您还没有看过的话。

于 2012-06-19T05:25:03.213 回答