Objective-c 新手 - UIViewController managedObjectContext 无法识别的选择器发送到实例

Objective-c newbie - UIViewController managedObjectContext unrecognized selector sent to instance

使用下面的代码我得到以下错误:

2016-04-25 10:04:51.520 eCoss[1700:620301] -[__NSCFString managedObjectContext]: unrecognized selector sent to instance 0x160383a0
objc[1700]: EXCEPTIONS: throwing 0x14f94500 (object 0x14d07b70, a NSException)
objc[1700]: EXCEPTIONS: searching through frame [ip=0xffffffff sp=0x26a0b0] for exception 0x14f944e0
objc[1700]: EXCEPTIONS: searching through frame [ip=0x2 sp=0x26b980] for exception 0x14f944e0
objc[1700]: EXCEPTIONS: unwinding through frame [ip=0xffffffff sp=0x26a0b0] for exception 0x14f944e0
objc[1700]: EXCEPTIONS: unwinding through frame [ip=0x2 sp=0x26b980] for exception 0x14f944e0
objc[1700]: EXCEPTIONS: handling exception 0x14f944e0 at 0x231e33b9
objc[1700]: EXCEPTIONS: rethrowing current exception
objc[1700]: EXCEPTIONS: searching through frame [ip=0x6 sp=0x26b980] for exception 0x14f944e0
objc[1700]: EXCEPTIONS: terminating
objc[1700]: EXCEPTIONS: searching through frame [ip=0x1 sp=0x26b820] for exception 0x14f944e0
objc[1700]: EXCEPTIONS: catch(id)
objc[1700]: EXCEPTIONS: unwinding through frame [ip=0x1 sp=0x26b820] for exception 0x14f944e0
objc[1700]: EXCEPTIONS: handling exception 0x14f944e0 at 0x22a6f089
2016-04-25 10:04:51.582 eCoss[1700:620301] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString managedObjectContext]: unrecognized selector sent to instance 0x160383a0'
*** First throw call stack:
(0x232d398b 0x22a6ee17 0x232d9325 0x232d6f51 0x232022f8 0x24dc0d9d 0x24dbffb1 0x5d06b 0x48f3d 0x48759 0x80a11 0x24d9b 0x27a70e61 0x27a70be7 0x27a70827 0x279e12fd 0x27a2ed13 0x279e12fd 0x27a2ed13 0x279e12fd 0x27a2ed13 0x27830e55 0x2786fde1 0x2786f593 0x27840055 0x2783e603 0x23295e6f 0x23295a5d 0x23293dcb 0x231e32e9 0x231e30d5 0x247d3ac9 0x278a80b9 0x1a4f1 0x22e8b873)
libc++abi.dylib: terminating with uncaught exception of type NSException

代码

-(UIViewController*) displayViewFromString:(NSString *) identifier
{
     ontracAppDelegate* delegate = [ontracAppDelegate sharedAppDelegate];
     NSManagedObjectContext* moc = delegate.managedObjectContext;

    if ([identifier isEqualToString:@"Notes"]) {
        viewController = [[ontracPageNotesViewController alloc] init];

        NSString *requestURL = [NSString stringWithFormat: @"http://mydomain/%i/true",self.dataObject.dataPack.pack_id ];
        NSLog(@"%@", requestURL);
        //the request is built based on the string
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [[NSURL alloc] initWithString: requestURL]];
        [request setHTTPMethod:@"GET"];
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

        NSDictionary *cookieProperties = [NSDictionary   dictionaryWithObjectsAndKeys:
                                      @"CAKEPHP", NSHTTPCookieName,
                                      @"mydomain.co.uk", NSHTTPCookieDomain,
                                      self.cookieValue, NSHTTPCookieValue,
                                      @"/", NSHTTPCookiePath,
                                      nil];
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
        NSArray* cookieArray = [NSArray arrayWithObjects: cookie, nil];
        NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookieArray];
        [request setAllHTTPHeaderFields:headers];

        NSError *err;
        NSURLResponse *resp;
        //the return data is formatted into a Json Response
        NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse:&resp error:&err];
        NSError *error;
        NSDictionary *json = [NSJSONSerialization
                          JSONObjectWithData:returnData
                          options:kNilOptions
                          error:&error];



        NSMutableArray *responseObjects = [json objectForKey:@"response"];


        for (DataObject *dataObject in responseObjects) {
            //if ([dataObject.dataPack.pack_id intValue] == self.dataObject.dataPack.pack_id){
            NSArray * value = [responseObjects objectForKey:dataObject];
            //NSString *noteString = [[NSString alloc] init] ;
            NSString *noteCreated = [value objectForKey:@"created"];
            NSArray *imageArray = [value objectForKey:@"images"];
            NSString *noteString = [value objectForKey:@"note"];
            NSString * noteUpdated = [value objectForKey:@"updated"];

            NSLog(@"do %@", dataObject);

            Notes *note = [NSEntityDescription insertNewObjectForEntityForName:@"Notes" inManagedObjectContext:moc];


            NSLog(@"%@", note);

            note.notes = noteString;
            note.noteID = [NSNumber numberWithInteger: dataObject];
            //note.notes = self.textField.text;
            NSMutableArray * array = [[NSMutableArray alloc] init];
            for (NSString *image in imageArray) {

                NSString *image_created = [image objectForKey:@"created"];
                NSString *image_id = [image objectForKey:@"id"];
                NSString *image_data = [image objectForKey:@"image_data"];
                NSString *image_type = [image objectForKey:@"image_type"];

                NSLog(@"%@", image_id);

                NSData *pngData = [[NSData alloc]initWithBase64EncodedString:image_data options:NSDataBase64DecodingIgnoreUnknownCharacters];
                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
                NSString *filePath = [documentsPath stringByAppendingPathComponent:[ NSString stringWithFormat:@"%@_%i_%@_notes_image.png", delegate.userName, self.dataObject.dataPack.pack_id, [self genRandStringLength:8]]]; //Add the file name
                [pngData writeToFile:filePath atomically:YES];

                [array addObject:filePath];

            }
            note.dataObject = dataObject;
            note.imageLocations = [NSKeyedArchiver archivedDataWithRootObject:array];
        NSLog(@"note %@", note);
            [dataObject addNotesObject:note];



        //}

      }

        //[[[splitView viewControllers] objectAtIndex:1]  pushViewController:notesView animated:YES];
    }
}

我在行 (note.notes = noteString) 处有一个换行符,这是产生错误的时间。在此之前,笔记对象被记录得很好。我只想将我从请求中获得的数据添加到其中。

核心数据

Notes.h

@class DataObject;

@interface Notes : NSManagedObject

@property (nonatomic, retain) NSData * imageLocations;
@property (nonatomic, retain) NSString * notes;
@property (nonatomic, retain) NSNumber * noteID;
@property (nonatomic, retain) DataObject *dataObject;

@end

Notes.m

#import "Notes.h"
#import "DataObject.h"


@implementation Notes

@dynamic imageLocations;
@dynamic notes;
@dynamic noteID;
@dynamic dataObject;

@end

managedObjectContext - appDelegate.m

- (NSManagedObjectContext *)managedObjectContext {

if (managedObjectContext != nil) {
    return managedObjectContext;
}

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

return managedObjectContext;
}

看来你的问题是你的数据类型全乱了。你的 JSON 东西被列为 NSDictionary,你试图从中取出 NSMutableArray。使用您当前的代码,该数组不可能对我可变。

然后您迭代该数组,并尝试将内容视为 DataObject 个实例,但它们实际上可能是 NSDictionary 个实例。

您还在使用 responseObjects objectForKey:dataObject,显然是在数组上,但该调用只适用于字典。然后,您继续使用 objectForKey 代码所说的是一个数组,但同样这应该是一个字典。

所以,我有点困惑,无法确切地说出这个问题出在哪里,但我认为你需要验证你正在使用的 class 类型,并确保它是你所想的是的。

同时显示创建 managedObjectContext 的代码。
您是否在后台线程中创建 managedObjectContext?
从崩溃的第一行来看,您的托管对象上下文似乎没有访问对象,其中包含注释 属性.

 [__NSCFString managedObjectContext]: unrecognized selector sent to instance 0x160383a0

最终验证您的JSON 响应是否正确并且没有输入。