从视图控制器传递后传递的托管对象上下文为空

Posted

技术标签:

【中文标题】从视图控制器传递后传递的托管对象上下文为空【英文标题】:passed managed object context is null after passing from view controller 【发布时间】:2012-05-25 15:14:49 【问题描述】:

我正在尝试做一个简单的核心数据应用程序。我在应用程序委托中有以下代码:

#import <UIKit/UIKit.h>

@interface HEFTAppDelegate : UIResponder <UIApplicationDelegate>




@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;


@end

然后在实现中

#import "HEFTAppDelegate.h"
#import "HEFTMasterViewController.h"
#import "HEFTTestdatabaseMasterViewController.h"
#import "HEFTData_Manager.h"

@implementation HEFTAppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
        
        //ipad init
        
     else 
        HEFTTestdatabaseMasterViewController *testDatabaseMasterViewController = [[HEFTTestdatabaseMasterViewController alloc]initWithStyle:UITableViewStylePlain];
        HEFTData_Manager *dataManager = [[HEFTData_Manager alloc]init];
        
        self.managedObjectContext = [dataManager mainObjectContext];
        
        // Pass the managed object context to the view controller.
        
        testDatabaseMasterViewController.managedObjectContext = self.managedObjectContext ;
        

    
    return YES;

HEFTData_Manager 类设置上下文等

查看调试器,上下文似乎已在应用委托中正确设置,并且

testDatabaseMasterViewController.managedObjectContext = self.managedObjectContext ;

消息已发出。

但是当表格视图出现时,HEFTTestdatabaseMasterViewController managedObjectContext 为 NULL

任何关于正在发生的事情的想法和指点将不胜感激。

调试器输出

在:

testDatabaseMasterViewController.managedObjectContext = self.managedObjectContext ;

testDatabaseMasterViewController    HEFTTestdatabaseMasterViewController
*   0x06d74b50 UITableViewController    UITableViewController    managedObjectContext   NSManagedObjectContext *    0x06d778e0
fetchedResultsController    NSFetchedResultsController *    0x00000000

在:

- (void)viewDidLoad

    [super viewDidLoad];
    
   // NSManagedObjectContext *context = self.managedObjectContext;
    
    NSLog(@"context : %@",self.managedObjectContext);
    
    self.navigationItem.leftBarButtonItem = self.editButtonItem;
    
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
    self.navigationItem.rightBarButtonItem = addButton;
    

self HEFTTestdatabaseMasterViewController *const 0x06d705a0 UITableViewController UITableViewController UIViewController UIViewController _tableViewStyle UITableViewStyle UITableViewStylePlain _keyboardSupport id 0x00000000 _staticDataSource id 0x00000000 _tableViewControllerFlags managedObjectContext NSManagedObjectContext * 0x00000000 fetchedResultsController NSFetchedResultsController * 0x00000000

【问题讨论】:

你在使用故事板吗?我问是因为您在didFinishLaunchingWithOptions 中返回 YES 之前没有设置 rootViewController 是的,我是。我正在使用标签栏控制器来控制应用程序。如果我添加类似: self.window.rootViewController = testDatabaseMasterViewController;应用程序加载但标签栏没有。抱歉,我在 OSX 上的一些经验后才开始使用 ios 【参考方案1】:

您应该在 HEFTTestdatabaseMasterViewController 类的 viewDidLoad 方法中分配您的 managedObjectContext 属性,或者如果这是一个您不应该编辑的库文件,只需将其子类化并将其设置在您的 viewDidLoad 中自定义类。

【讨论】:

感谢使用它并且它有效:id appDelegate = (id)[[UIApplication sharedApplication] delegate]; self.managedObjectContext = [appDelegate managedObjectContext];【参考方案2】:

添加:

id appDelegate = (id)[[UIApplication sharedApplication] delegate]; self.managedObjectContext = [appDelegate managedObjectContext];

到HEFTTestDatabaseMasterVIewController的viewDidLoad方法

在需要访问 managedObjectContext 的其他类中工作并且也将工作

【讨论】:

以上是关于从视图控制器传递后传递的托管对象上下文为空的主要内容,如果未能解决你的问题,请参考以下文章

为 segue 中传递的新 nsmanagedobject 释放分配的上下文

OS X Core Data - 将托管对象上下文传递给视图控制器

如何通过应用程序委托使用托管对象上下文实例化还原的视图控制器?

共享托管对象上下文

SwiftUI - 将托管对象上下文传递给模型

在托管对象上下文之间传递对象