嗨,我正在尝试设置UIViewController's受管对象上下文,但未保存对象上下文。这是代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
my_TableViewController *viewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"coretut"];
if ([viewController isKindOfClass:[my_TableViewController class]]) {
    [viewController setOManagedObjectContext:self.managedObjectContext];
}
NSLog(@"%@", self.managedObjectContext);
NSLog(@"%@", viewController.oManagedObjectContext);
}

以下内容的输出是
Apple_Tutorial[11241:461826] <NSManagedObjectContext: 0x7fb558d86600>
Apple_Tutorial[11241:461826] <NSManagedObjectContext: 0x7fb558d86600>

但是当我打电话
NSLog(@"%@", self.oManagedObjectContext);

viewDidLoad()的my_TableViewController中,输出为null。 oManagedObjectContext声明为(strong, nonatomic)。有谁知道为什么oManagedObjectContext变为null?

viewDidLoad代码:
- (void)viewDidLoad {
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"my_TableViewCell" bundle:nil];
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"tableViewCell"];

    NSLog(@"%@", self.oManagedObjectContext);
}

最佳答案

问题在于didFinishLaunchingWithOptions实例化了一个新的视图控制器,然后对其不执行任何操作(即丢弃它)。因此,您正在查看两个不同的视图控制器实例。

您可能让应用程序委托设置了根视图控制器的oManagedObjectContext:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ViewController *controller = (id)self.window.rootViewController;
    NSAssert([controller isKindOfClass:[ViewController class]], @"Root controller should be `ViewController`, but is %@", controller);

    controller.oManagedObjectContext = self.managedObjectContext;

    return YES;
}

显然,如果您所讨论的视图控制器不是根控制器(例如,如果它位于某个容器视图控制器中,例如导航控制器,标签栏控制器,自定义容器控制器等),那么您就必须调整上面的代码在该层次结构中导航以找到您的视图控制器类。

07-26 01:59