如何使用AFNetworking使用JSON数据填充NSDictionary对象来填充原型单元格文本标签

时间:2013-05-12 17:07:33

标签: ios json nsdictionary nstableview afnetworking

iOS新手。我正在使用AFNetworking下载JSON数据并将数据放入Dictionary对象中。这在以下代码中完成:

-(void)locationRequest
{
NSURL *url = [NSURL URLWithString:@"http://sitespec/php/getlocations.php"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];
//AFNetworking asynchronous url request
AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                     JSONRequestOperationWithRequest:request
                                     success:^(NSURLRequest *request, NSHTTPURLResponse         *response, id responseObject)
                                     {

                                         self.locationsFromJSON = (NSDictionary *)responseObject;

                                         NSLog(@"JSON RESULT %@", responseObject);
                                         NSLog(@"JSON DICTIONARY %@", _locationsFromJSON);
                                         [self.tableView reloadData];
                                     }
                                     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id responseObject)
                                     {
                                         NSLog(@"Request Failed: %@, %@", error, error.userInfo);
                                     }];

[operation start];

}

我正在获取数据并填充Dictionary数组,如下面NSLOG调用的outpur中所示:

2013-05-12 12:44:08.851 sitespec[2024:c07] JSON RESULT (
    {
    city = "Rocky Mount";
    id = 1;
    name = "Rocky Mount";
    phone = "(252) 451-1811";
    state = NC;
    "street_address" = "620 Health Drive";
    zip = 27804;
},
    {
    city = "Elizabeth City";
    id = 2;
    name = "Elizabeth City";
    phone = "(252) 335-4355";
    state = NC;
    "street_address" = "109 Corporate Drive";
    zip = 27906;
}
)
2013-05-12 12:44:08.852 sitespec[2024:c07] JSON DICTIONARY (
    {
    city = "Rocky Mount";
    id = 1;
    name = "Rocky Mount";
    phone = "(252) 451-1811";
    state = NC;
    "street_address" = "620 Health Drive";
    zip = 27804;
},
    {
    city = "Elizabeth City";
    id = 2;
    name = "Elizabeth City";
    phone = "(252) 335-4355";
    state = NC;
    "street_address" = "109 Corporate Drive";
    zip = 27906;
}
)

但是,这是我失去的地方.....

如何在

中的Dictionary对象中访问此数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

方法?

类似的东西:

 static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

cell.textLabel.text = [self.locationsFromJSON objectForKey:@"name"]; 

???

这不起作用,我收到SIGBART错误。我只是想弄清楚如何读出数据并填充表格视图?

我该怎么做?非常感谢你的帮助......

3 个答案:

答案 0 :(得分:1)

我经常看到这一点,我不明白为什么人们很难从字典中提取数据并使用字典的内容填充表格视图。我不明白为什么人们不为JSON响应创建模型类,然后根据需要将模型添加到数组中。

所以 Tommy 我强烈建议你创建一个名为Address的类模型(例如)并将所有JSON属性作为属性添加到模型类中,当你解析你创建的JSON时,地址类实例您将添加到数组。之后,在您的表视图类中,您将拥有一组地址并用于:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section您将返回yourAddressesArray.count

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    Address *address = [yourAddressesArray objectAtIndex:indexPath.row];    //assign your address properties to labels etc 

}

当你有模型类时,它会更容易;)

编辑分享

从我在你的问题中看到的你有一系列词典。所以我建议做这样的事情:

在Address类中,使用josn:

创建一个imit方法
-(id)initAddressWithJSON:(id)JSON {
    slef = [super init];
    if(self) {
      self.city = [JSON objectForKey:@"city"];
      // set all the properties here
    }
    return self;
}

当你收到所谓的json响应时,让我们说“jsonResopnse”你应该做的事情:

-(NSArray*)myAddressesFromJSON:(id)JSON {

   //you should add a validation here for JSON  (not null not empty)
   NSMutableArray *addresses = [[NSMutableArray alloc] init];
   Address *address;
   for(NSDictionary *addressDict in JSON) {
       address = [[Address alloc] initWithJSON:addressDict];
       [addresses addObject:address]; 
   }
   return addresses;
}

注意,我从头脑中编写了代码并且我没有使用Xcode :)并且可能存在一些构建错误(拼写错误),但我希望你有这个想法。另外我想你正在使用JSONKit。

答案 1 :(得分:0)

如我所见,您在同一个类中使用JSON请求和UITableView。在cellForRowAtIndexPath方法中设置断点并检查是否已存在数据。如果不是,那么:

询问- (NSInteger)numberOfRowsInSection:(NSInteger)section方法或numberOfSections中是否已填写字典。否则返回0。

在收到JSON数据的方法中,调用[tableView reloadData];

如果不是问题,请告诉您SIGBART错误的位置;)

答案 2 :(得分:-1)

感谢danypata提供了很好的反馈。我采取了一个略有不同的路线来实现这一目标。让我想到的是danypata的评论“看起来你的JSON响应中有一系列的词典”....在AFNetworking块中我获得了JSON响应,我将JSON对象分配给定义为属性的数组当前的TableVIewCOntroller。

-(void)locationRequest

{     NSURL * url = [NSURL URLWithString:@“myurl”];

NSURLRequest *request = [NSURLRequest requestWithURL:url];
//AFNetworking asynchronous url request
AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                     JSONRequestOperationWithRequest:request
                                     success:^(NSURLRequest *request, NSHTTPURLResponse *response, id responseObject)
                                     {

                                         self.locationsFromJSON = responseObject;
                                         [self.tableView reloadData];
                                     }
                                     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id responseObject)
                                     {
                                         NSLog(@"Request Failed: %@, %@", error, error.userInfo);
                                     }];

[operation start];

}

我还为JSON响应中的每个值声明了一个Mutable Dictionary属性和一个NSString属性。在下面的TableVIewCell方法中,我抓取位于index.row的对象字典,并读出键的值并将它们分配给原型单元格标签属性。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"locCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    
if (cell == nil) {

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  reuseIdentifier:CellIdentifier];

}


self.dictObj = [[NSMutableDictionary alloc] init];
self.dictObj = [_locationsFromJSON objectAtIndex:indexPath.row];
cell.textLabel.text =  [_dictObj valueForKey:@"city"];  
cell.detailTextLabel.text = [_dictObj valueForKey:@"phone"];     
return cell;
}

这有效!它只是让其他人指出明显的“看起来你有一个字典对象数组......”