【问题标题】: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

标签: objective-c 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 的其他类中工作并且也将工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多