Search code examples
cocoaxcodeiostouchjson

'NSDictionary' may not respond to '+dictionaryWithJSONString'... when using TouchJSON


I'm really new to Cocoa development, so please be kind. Anyway, I'm trying to deserialize a JSON string I'm sending from my server through TouchJSON, but I'm getting a compiler warning of 'NSDictionary' may not respond to '+dictionaryWithJSONString:error:'.

I understand what the error is saying, but I have all the TouchJSON files in the project, and I have a reference to NSDictionary_JSONExtensions.h in the app_Prefix.pch file. When I type the command I do see it show up in the code sense, so why is it failing in the compiler?

Here's the code where it's failing, I'd appreciate any suggestions:

- (IBAction)authorizeUser:(id)sender {
 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://192.168.0.5/iOS"]];

 [request setRequestMethod:@"POST"];
 [request setPostValue:credentialsName.text forKey:@"Credentials.Name"];
 [request setPostValue:credentialsPassword.text forKey:@"Credentials.Password"];
 [request setPostValue:credentialsPIN.text forKey:@"Credentials.PIN"];
 [request startSynchronous];

 NSError *requestError = [request error];

 if (!requestError) {
  NSError *jsonError = NULL;
  NSDictionary *responseDictionary = [NSDictionary dictionaryWithJSONString:[request responseString] error:&jsonError]; /* <- ERROR... */

  status.text = [responseDictionary objectForKey:@"Success"];
 }
}

Thanks in advance!

UPDATE

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "ASIFormDataRequest.h"
    #import "CJSONDeserializer.h"
    #import "NSDictionary_JSONExtensions.h"
#endif

UPDATE 2

This is what shows up in the Preprocess, and the files are there as well as the method, so it should be working?

# 10 "/Users/Alex/Documents/iPad/Classes/SignInViewController.m" 2
# 1 "/Users/Alex/Documents/iPad/TouchJSON/Extensions/NSDictionary_JSONExtensions.h" 1
# 32 "/Users/Alex/Documents/iPad/TouchJSON/Extensions/NSDictionary_JSONExtensions.h"
@interface NSDictionary (NSDictionary_JSONExtensions)

+ (id)dictionaryWithJSONData:(NSData *)inData error:(NSError **)outError;

Solution

  • The problem is that

    + (id)dictionaryWithJSONString:(NSString *)inJSON error:(NSError **)outError;
    

    is defined in the implementation file (NSDictionary_JSONExtensions.m) but hasn't been declared in the header file (NSDictionary_JSONExtensions.h):

    @interface NSDictionary (NSDictionary_JSONExtensions)
    + (id)dictionaryWithJSONData:(NSData *)inData error:(NSError **)outError;
    @end
    

    none

    You can patch the header file and add the declaration of the method you're using:

    @interface NSDictionary (NSDictionary_JSONExtensions)
    + (id)dictionaryWithJSONData:(NSData *)inData error:(NSError **)outError;
    + (id)dictionaryWithJSONString:(NSString *)inJSON error:(NSError **)outError;
    @end
    

    until the developers fix this. I've just alerted TouchJSON's maintainer of this problem.