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

时间:2013-05-31 07:58:38

标签: iphone ios json uitableview

我是iPhone开发的新手,我正试图在JSON中绑定来自UITableview 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"
  }    
]    

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您要在相同的范围内返回两次单元格,尝试删除第一个return cell;,同时您在reloadData循环之前调用表格for;在这种情况下,表的dataSource可能仍为空,因此请在reloadData循环后调用for

编辑: 发生的事情很奇怪,objectFromString must return一个NSArrayNSDictionary,但它似乎指向NSSet。我可以另外建议两件事:

  1. 由于您在autorelease上呼叫UITableViewCell,因此您似乎不会使用ARC。在这种情况下,您在parser中泄漏了json_stringviewDidLoad,因此release就泄漏了。

  2. 确保致电[super viewDidLoad];(您的代码中没有这样做)。

答案 2 :(得分:0)

使用ViewDidload中的以下代码和运行项目,它将起作用。

  

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    statuses=[[NSMutableArray alloc]init];

    NSURL *myURL = [NSURL URLWithString:@"http://80f237c226fa45aaa09a5f5c82339d46.cloudapp.net/DownloadService.svc/Courses"];


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];


    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]

                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

                               NSLog(@"Finished with status code: %i", [(NSHTTPURLResponse *)response statusCode]);
                              id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];


                                NSLog(@"jsonObject=%@",jsonObject);

                               statuses=[jsonObject mutableCopy];

                               [self.coursetable reloadData];
                           }];

    NSLog(@"myURL=%@",myURL);

}


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

    id obj = [statuses objectAtIndex:indexPath.row];
    cell.textLabel.text =[obj valueForKey:@"Title"];

    return cell;
}

答案 3 :(得分:0)

 - (void)viewDidLoad
   {

  NSString *dictStr=@"{\"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\"}";

 NSDictionary *rootDict =[NSJSONSerialization JSONObjectWithData: [dictStr dataUsingEncoding:NSUTF8StringEncoding]
                                    options: NSJSONReadingMutableContainers
                                      error: nil];
     NSArray *keys=[[rootDict allKeys] sortedArrayUsingSelector:@selector(compare:)];
   }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
   {
     return [keys count];
   }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
   {
     static NSString *cellIdentifier=@"cellIdentifier";
     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

     if (cell==nil) {
      cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
     }

      cell.textLabel.text=[rootDict valueForKey:[keys objectAtIndex:indexPath.row]];
      return cell;
  }

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

答案 4 :(得分:0)

是的我认为是正确的,状态不是NSArray,它是NSSet所以如果你在NSSet上调用objectAtIndex它会崩溃。要获取数组将NSSet转换为NSArray。

NSArray *array =[statuses allObjects];