iPhone JSON 到 TableView

Posted

技术标签:

【中文标题】iPhone JSON 到 TableView【英文标题】:IPhone JSON to TableView 【发布时间】:2011-12-25 07:05:30 【问题描述】:

我的代码有问题,它返回一个错误,上面写着...

2011-12-24 22:52:36.280 BusinessManager[479:20b] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSCFDictionary isEqualToString:]:无法识别的选择器发送到实例 0x3e965e0'>

代码如下:

 #import "BusinessManagerAppDelegate.h"
 #import "ProspectViewController.h"
 #import "JSON.h"

 @implementation ProspectViewController

 @synthesize jsonArray;

- (void)viewDidLoad 
NSURL *jsonURL = [NSURL URLWithString:@"https://www.mysite.php"];
NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL];

NSLog(jsonData);
self.jsonArray = [jsonData JSONValue]; 

[jsonURL release];
[jsonData release];


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section      
return [jsonArray count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath     
static NSString *Prospects = @"agencyname";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Prospects];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:Prospects] autorelease];


cell.text = (NSString *)[self.jsonArray objectAtIndex:indexPath.row];
return cell;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath 



- (void)viewWillAppear:(BOOL)animated 
[super viewWillAppear:animated];


- (void)viewDidAppear:(BOOL)animated 
[super viewDidAppear:animated];


- (void)viewWillDisappear:(BOOL)animated 


- (void)viewDidDisappear:(BOOL)animated 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation    
return (interfaceOrientation == UIInterfaceOrientationPortrait);


- (void)didReceiveMemoryWarning 
[super didReceiveMemoryWarning]; 


- (void)dealloc 
[jsonArray dealloc];
[super dealloc];


@end

我很确定我已经正确设置了所有内容,并且 JSON 在控制台中正确返回。

【问题讨论】:

【参考方案1】:

cell.textLabel.text = (NSString *)[self.jsonArray objectAtIndex:indexPath.row]; (编辑:请注意,原始代码访问的是cell.text,而不是cell.textLabel.text

这一行很可能是错误。让我们一步一步看: 1. JSON 输出是一个数组,存储在 jsonArray 中(检查以确保它也不是字典)。 2.[self.jsonArray objectAtIndex:indexPath.row] 可能是一个 NSDictionary。从返回的异常中可以看出,它涉及 NCSFDictionary。事实上,很多时候,JSON 输出是字典数组 3. 出现错误 'NSInvalidArgumentException', reason: '* -[NSCFDictionary isEqualToString:]: unrecognized selector sent to instance 0x3e965e0'>,代码试图将 NSDictionary 与 NSString 进行比较。 4. 要解决这个问题,请更仔细地查看 JSON 输出并对其进行剖析!并确保 JSON 输出不会因情况而异(使用不同的 URL)。

【讨论】:

我不知道 NSDictionary JSON 和 NSArray JSON 之间的巨大区别...这是我的 JSON["0":"Test Agency","agencyname":"Test Agency ","0":"测试机构","agencyname":"测试机构"] 当你解析 JSON 时,你正在将它翻译成 Objective-C。这可以作为 NSDictionary 或 NSArray 出现。您可以在此处了解有关 NSDictionaries 的更多信息:developer.apple.com/library/ios/#documentation/Cocoa/Reference/…。基本上,您需要将其更改为NSDictionary *infoDictionary = [self.jsonArray objectAtIndex:indexPath.row]。然后做cell.text = [infoDictionary objectForKey:@"agencyname"]。 NSDictionary 是一种存储具有“键”和“值”(“agencyname”->“Test Agency” 我爱你。一整天都在想办法解决这个问题。【参考方案2】:

您发布的代码与您的崩溃无关。只需使用 Xcode 的搜索导航器在您的代码中找到所有 isEqualToString: 并在那里放置断点。当你找到一个导致这个崩溃的对象时,找出它为什么变成 NSDictionary 而不是 NSString(可能是因为你给它分配了一个错误的值)。

【讨论】:

isEqualToString 在 JSON 类中,所以我认为代码中存在问题。 那么你可能通过解析 NSDictionary 而不是 NSString【参考方案3】:

您将从 JSONValue 中得到一个 NSDictionary。这意味着您需要获取字典并获取要在表中显示的每个值。

NSDictionary *dictionary = [self.jsonArray objectAtIndex:indexPath.row]; cell.textLabel.text = [dictionary objectForKey:@"agencyname"];

【讨论】:

以上是关于iPhone JSON 到 TableView的主要内容,如果未能解决你的问题,请参考以下文章

iPhone JSON 数组到变量

iPhone json 库将 json 映射到我自己的对象

iPhone JSON 到 TableView

iPhone- 在 POST 中将 JSON 对象发送到 PHP 服务器并从服务器获取响应

在iphone中解析&到&中的json

如何使用 iPhone 的 JSON 框架以编程方式生成 JSON