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的主要内容,如果未能解决你的问题,请参考以下文章