【问题标题】:'NSDictionary' may not respond to '+dictionaryWithJSONString'... when using TouchJSON使用 TouchJSON 时,“NSDictionary”可能无法响应“+dictionaryWithJSONString”...
【发布时间】:2011-01-28 03:15:02
【问题描述】:

我真的是 Cocoa 开发的新手,所以请善待。无论如何,我正在尝试反序列化我通过 TouchJSON 从服务器发送的 JSON 字符串,但我收到了 'NSDictionary' may not respond to '+dictionaryWithJSONString:error:' 的编译器警告。

我明白错误在说什么,但我在项目中有所有 TouchJSON 文件,并且我在 app_Prefix.pch 文件中有对 NSDictionary_JSONExtensions.h 的引用。当我输入命令时,我确实看到它在代码意义上显示,那么为什么它在编译器中失败了?

这是失败的代码,如果有任何建议,我将不胜感激:

- (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"];
 }
}

提前致谢!

更新

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

更新 2

这是 Preprocess 中显示的内容,文件和方法都在那里,所以它应该可以工作?

# 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;

【问题讨论】:

  • 发布您的前缀文件内容。
  • @Bavarious,请看我上面的更新。
  • @Alex 根据 seppo0010 的建议,检查您的目标是否启用了“预编译前缀标头”并且“前缀标头”是您的前缀文件的正确名称。此外,尝试清理目标并重建它。无论如何,如果在你的实现文件中 #importing 头文件也不起作用,那就大错特错了。
  • @Bavarious,我检查了设置并没有启用它,所以我继续启用它并将“前缀标题”设置为 PCH 文件。可悲的是它仍然没有效果,这意味着有一些非常错误的,正如你所说。现在,我使用 XCode 的经验大约不到 10 小时,将 TouchJSON(和 ASIHttpRequest)文件放在“其他来源”目录中是否正确?是否有编译版本(来自.NET,我习惯于 DLL...)?
  • 'Other Sources' 只是一个逻辑组,所以没关系。编译后的版本通常捆绑为框架包,但有时它们可​​以作为独立的静态或动态库使用。不确定 TouchJSON 是否提供它们。

标签: cocoa xcode ios touchjson


【解决方案1】:

问题是

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

在实现文件(NSDictionary_JSONExtensions.m)中定义,但尚未在头文件(NSDictionary_JSONExtensions.h)中声明:

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

您可以修补头文件并添加您正在使用的方法的声明:

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

直到开发者解决这个问题。我刚刚通知了 TouchJSON 的维护者这个问题。

【讨论】:

  • 作为记录,TouchJSON 的维护者已经(并且及时!)修复了这个问题。
【解决方案2】:

忽略代码意义。它总是建议可能不可用的东西。 在您的 .m 上导入 NSDictionary_JSONExtensions.h 应该可以解决问题。问题是,如果它在您的 .pch 上,为什么不固定。

阅读prefix restrictions,您可能想检查一下:

* 每个目标使用一个且仅一个前缀标头。 * 为使用预编译头文件的每个目标设置前缀头文件和预编译前缀头文件构建设置。

【讨论】:

  • 我把引用放在 PCH 和 M 文件中,没有区别。我也很好奇,为什么它在PCH文件中时会失败(那不是全局参考文件吗?)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多