gpt4 book ai didi

ios - 无法将 NSManagedObjectContext 传递给我的 View Controller

转载 作者:行者123 更新时间:2023-11-29 13:40:25 25 4
gpt4 key购买 nike

好吧,我在这里可能有点不知所措,但我怀疑我遗漏了一些非常基本的东西。我在堆栈和其他论坛上搜索以寻求解决方案的帮助。我已经尝试了我找到的所有解决方案,但没有一个适合我的情况,而且我看不出我遗漏了什么。

我已经创建了一个 CoreData 应用程序。在我的 appDelegate 中使用 NSManagedObjectContext 读取和写入数据到 CoreData 存储时一切正常。我检查了 NSManagedObjectContext 是否设置在我的 AppDelegate 中,它是。将它传递给我唯一的 viewController 后,我检查它是否已设置,但未设置。所以这显然是我的问题。我已经尝试了所有方法,但无法理解解决方案,现在累了,想上床 sleep 。我是 iOS 的新手,所以我确信它是基础知识。

这是我的代码。

AppDelegate.m

#import "AppDelegate.h"
#import "ViewController.h"
#import "Recipe.h"

@interface AppDelegate()

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, strong) ViewController *viewController;
@end

@implementation AppDelegate

@synthesize managedObjectModel, managedObjectContext, persistentStoreCoordinator, viewController;

@synthesize window = _window;

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

NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
NSLog(@"There is an error!!!");
}

if (context == nil) {
NSLog(@"Context is nil in appdelegate");
}
else {
NSLog(@"Context is set in appdelegate");
}

viewController.managedObjectContext = self.managedObjectContext;

// Override point for customization after application launch.
return YES;
}

#pragma mark - Core Data

- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel == nil) {
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"RecipeBook" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
}
return managedObjectModel;
}

- (NSString *)documentsDirectory
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return documentsDirectory;
}

- (NSString *)dataStorePath
{
return [[self documentsDirectory] stringByAppendingPathComponent:@"DataStore.sqlite"];
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator == nil) {
NSURL *storeURL = [NSURL fileURLWithPath:[self dataStorePath]];

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

NSError *error;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Error adding persistent store %@, %@", error, [error userInfo]);
abort();
}
}
return persistentStoreCoordinator;
}

- (NSManagedObjectContext *)managedObjectContext
{
if (managedObjectContext == nil) {
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:coordinator];
}
}
return managedObjectContext;
}
@end

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UITableViewController {
NSArray *recipes;
NSManagedObjectContext *managedObjectContext;
}

@property (nonatomic, retain) NSArray *recipes;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end

ViewController.m

#import "ViewController.h"
#import "Recipe.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize recipes;
@synthesize managedObjectContext;

- (void)viewDidLoad
{
[super viewDidLoad];

NSLog(@"View Did Load");

NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
NSLog(@"There is an error!!!");
}

if (context == nil) {
NSLog(@"Context is nil in viewController");
}
else {
NSLog(@"Context is set in viewController");
}

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} else {
return YES;
}
}

- (void)viewDidUnload {
[super viewDidUnload];
}

@end

我知道我的 ViewController 中的 NSManagedObjectContext 为 nil。问题是如何将我的上下文从 AppDelegate 传递到 ViewController?每次我想查询 CoreData 时,我不想从我的 viewControllers 中质疑 AppDelegate(希望添加更多),我希望传递 managedObjectContext。

我希望一切都有意义。 :)

最佳答案

我找到了问题的答案。 managedObjectContext 没有正确传递到我的 viewController。

我正在使用:

viewController.managedObjectContext = self.managedObjectContext;

我应该在什么时候使用:

ViewController *viewController = (ViewController *)self.window.rootViewController;
viewController.managedObjectContext = self.managedObjectContext;

感谢 user523234 让我走上正轨。

关于ios - 无法将 NSManagedObjectContext 传递给我的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com