gpt4 book ai didi

ios - managedObjectContext 无法识别的选择器发送到实例

转载 作者:行者123 更新时间:2023-11-28 18:05:57 27 4
gpt4 key购买 nike

我正在按照教程开发 iOS 应用程序。我正在使用核心数据。应用程序的第一个 View 是 RootViewController。所有核心数据堆栈都在 AppDelegate 文件中。这是 AppDelegate.m 中调用 RootViewController 文件的代码部分:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Fetch the data to see if we ought to pre-populate
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}

[self loadFavoriteThingsData];

RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
[rootViewController setManagedObjectContext:[self managedObjectContext]];

[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
return YES;
}

现在,在应用程序的另一部分,我需要打开一个新的 View Controller ,它是 RootViewController 的副本,名为 DoneViewController,但使用其他 NSPredicate s 显示其他核心数据对象。

RootViewController 中有一个按钮可以打开 MenuViewController 文件,从那里我尝试使用以下方法打开 DoneViewController:

- (IBAction)doneToDoaction:(id)sender {
DoneViewController *viewController = [[DoneViewController alloc] init];

[self presentViewController:viewController animated:YES completion:nil];
}

但是一个异常被触发了:

[MenuViewController managedObjectContext]: unrecognized selector sent to instance 0x145a0c00
2013-12-26 22:58:23.688 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MenuViewController managedObjectContext]: unrecognized selector sent to instance

我想我必须将 managedObjectContextRootViewController 传递到 MenuViewController,然后从 MenuViewController 传递到 DoneViewController,但我不知道该怎么做。

最佳答案

这是因为您没有使用 NSObject 类。为此,您必须在 AppDelegate.h 中实现 NSObject。像这样..

@interface AppDelegate : UIResponder <UIApplicationDelegate,NSObject>{
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
}

并添加属性。

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (NSString *)applicationDocumentsDirectory;

同时在 AppDelegate.m 文件中添加代码...

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

return managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil] ;

return managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

{

if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"<Project Name>.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error])
{
/*Error for store creation should be handled in here*/
}

return persistentStoreCoordinator;
}
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

这对我 100% 有效。希望它对你有用。

关于ios - managedObjectContext 无法识别的选择器发送到实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20795716/

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