Iphone ios-如何在UITableView中从JSON url加载数据?

Iphone ios-如何在UITableView中从JSON url加载数据?,iphone,ios,json,uitableview,Iphone,Ios,Json,Uitableview,我是iPhone开发的新手,我正在尝试从UITableview中的JSONUrl绑定数据,但下面的代码中出现了一个错误 - (void)viewDidLoad { SBJsonParser *parser = [[SBJsonParser alloc] init]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://80f237c226fa45aaa09a5f5c82339d46

我是iPhone开发的新手,我正在尝试从
UITableview
中的
JSON
Url绑定数据,但下面的代码中出现了一个错误

- (void)viewDidLoad
{

SBJsonParser *parser = [[SBJsonParser alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://80f237c226fa45aaa09a5f5c82339d46.cloudapp.net/DownloadService.svc/Courses"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
statuses = [parser objectWithString:json_string error:nil];
[self.dropdownTblView reloadData];
for (NSDictionary *status in statuses) 
{
    _altTitle = [status valueForKey:@"Title"];
    NSLog(@"Title %@",_altTitle);
}

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   NSLog(@"%d",[statuses count]);
   return [statuses count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
return cell;

 //Here I'm getting an error    
id obj = [statuses objectAtIndex:indexPath.row];
NSString *name = [obj valueForKey:@"Title"];
cell.textLabel.text =name;
return cell;
}
这是我的JSON

[
  {
    "Id": 1,
    "Title": "Tamil to English",
    "AltTitle": "த|மி|ழ்| |மூ|ல|ம்| |ஆ|ங்|கி|ல|ம்",
    "Description": "Learn English through Tamil",
    "Code": 1,
    "Version": "1.0",
    "SourceLanguageIndicator": "அ",
    "TargetLanguageIndicator": "A",
    "SourceLanguageCode": "ta",
    "TargetLanguageCode": "en",
    "Updated": "2013-02-21T03:33:19.6601651+00:00"
  }    
]    

有什么想法吗?提前谢谢。

可能是因为您将
obj
的类型设置为
id
。它太通用,可能不知道如何响应
valueForKey
。您是否尝试将
obj
声明为
NSDictionary*
?如下面的代码所示:

NSDictionary *obj = [statuses objectAtIndex:indexPath.row];
NSString *name = [obj valueForKey:@"Title"];

可能是因为您将
obj
的类型设置为
id
。它太通用,可能不知道如何响应
valueForKey
。您是否尝试将
obj
声明为
NSDictionary*
?如下面的代码所示:

NSDictionary *obj = [statuses objectAtIndex:indexPath.row];
NSString *name = [obj valueForKey:@"Title"];

如果在同一范围内返回两次单元格,请尝试删除第一个
返回单元格
,也就是在
for
循环之前调用表上的
reloadData
;在这种情况下,表的数据源可能仍然为空,因此在
for
循环之后调用
reloadData

编辑: 发生的事情很奇怪,
objectFromString
a
NSArray
NSDictionary
,但它似乎指向一个
NSSet
。此外,我还可以建议两件事:

  • 似乎您没有使用ARC,因为您正在
    UITableViewCell
    上调用
    autorelease
    。在本例中,您在
    viewDidLoad
    中泄漏了
    解析器
    json_字符串
    ,因此
    释放它们

  • 确保调用
    [super viewDidLoad](您没有在代码中执行此操作)


  • 如果在同一范围内返回两次单元格,请尝试删除第一个
    返回单元格
    ,也就是在
    for
    循环之前调用表上的
    reloadData
    ;在这种情况下,表的数据源可能仍然为空,因此在
    for
    循环之后调用
    reloadData

    编辑: 发生的事情很奇怪,
    objectFromString
    a
    NSArray
    NSDictionary
    ,但它似乎指向一个
    NSSet
    。此外,我还可以建议两件事:

  • 似乎您没有使用ARC,因为您正在
    UITableViewCell
    上调用
    autorelease
    。在本例中,您在
    viewDidLoad
    中泄漏了
    解析器
    json_字符串
    ,因此
    释放它们

  • 确保调用
    [super viewDidLoad](您没有在代码中执行此操作)


  • 在您的
    ViewDidload
    中使用下面的代码并运行该项目,它将起作用


    注意:您返回单元格两次,请尝试删除第一次返回 细胞


    在您的
    ViewDidload
    中使用下面的代码并运行该项目,它将起作用


    注意:您返回单元格两次,请尝试删除第一次返回 细胞

    记住rootDict和密钥将声明为全局。


    记住rootDict和键将声明为全局。

    是的,我想对了,状态不是NSArray,而是NSSet,因此如果在NSSet上调用objectAtIndex,它将崩溃。要获取数组,请将NSSet转换为NSArray

    NSArray *array =[statuses allObjects];  
    

    是的,我的想法是对的,状态不是NSArray,而是NSSet,所以如果在NSSet上调用objectAtIndex,它将崩溃。要获取数组,请将NSSet转换为NSArray

    NSArray *array =[statuses allObjects];  
    


    你犯了什么错误?那么?错误是什么?您在同一范围内返回两次单元格,请尝试删除第一个
    返回单元格检查返回的是什么状态?我的意思是,一旦你得到解析数据,只需打印并检查它是字典还是数组。然后删除第一个返回单元格语句。你能告诉我们你得到了什么错误吗?你得到了什么错误?那么?错误是什么?您在同一范围内返回两次单元格,请尝试删除第一个
    返回单元格检查返回的是什么状态?我的意思是,一旦你得到解析数据,只需打印并检查它是字典还是数组。然后删除第一个返回单元格语句。你能告诉我们你得到了什么错误吗?我想这不是问题所在。既然他知道有一本字典,就可以把它设为id。我想这不是问题所在。因为他知道有一本字典,所以可以把它设为id。谢谢你宝贵的回复,但我还是收到了一封电子邮件error@user2439531你的错误是什么?另外,我不知道您是否在使用ARC。程序接收到信号:“EXC_BAD_ACCESS”。您是否已将
    [self.dropdownTblView reloadData]在我的响应中所述的for循环之后?可能设置一个断点来检查哪一行引发了错误;谢谢你宝贵的回复,但我还是收到了一封信error@user2439531你的错误是什么?另外,我不知道您是否在使用ARC。程序接收到信号:“EXC_BAD_ACCESS”。您是否已将
    [self.dropdownTblView reloadData]在我的响应中所述的for循环之后?可能设置一个断点来检查哪一行引发了错误;可能是的,但我想知道为什么
    objectFromString
    返回的是集合而不是数组?
    objectFromString
    的文档说明:
    对象所代表的NSArray或NSDictionary,如果发生错误,则说明为零。
    打印状态并检查返回的内容,NSArray或NSDictionary?请显示您得到的确切内容。只需打印为NSLog(@“%@,[parser objectWithString:json_string error:nil];);。不需要分配给任何对象。可能是的,但我想知道为什么
    objectFromString
    返回的是集合而不是数组?
    objectFromString
    的文档说明:
    NSArray