如何将JSON数组中的所有记录加载到UITableViewCell中?

时间:2015-01-07 05:36:53

标签: ios objective-c json uitableview

我在这里已经完成了一些问题,并尝试了其他人给出的一些建议,但似乎都没有。基本上我从我的webservice收到了JSON数据,并填充了一个我希望放入UITableViewCell的数组。但我的问题是tableview单元格只显示我的数组中的一条记录。我需要将所有记录显示为用户的列表视图。

这是我的Web服务解析JSON数组:

    NSData *data = [soapResultsString dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0      error:nil];
    NSArray *planArray = [json objectForKey:@"plan_type"];
    NSLog(@"planArray==>%@",planArray);
    NSLog(@"planArrayCount==>%d",[planArray count]);
for (int i = 0 ; i<[planArray count]; i++) {
        NSLog(@"print==>%d",i);
        recordResults = NO;
        appDelegate.nameString = [[[json valueForKey:@"plan_type"]valueForKey:@"name"]objectAtIndex:i];
        appDelegate.ageString=[[[json valueForKey:@"plan_type"]valueForKey:@"age"]objectAtIndex:i];
        appDelegate.sexString=[[[json valueForKey:@"plan_type"]valueForKey:@"sex"]objectAtIndex:i];
        appDelegate.deptString=[[[json valueForKey:@"plan_type"]valueForKey:@"dept"]objectAtIndex:i];
        NSLog(@"name==%@,age==%@,sex==%@,dept==%@",appDelegate.nameString,appDelegate.ageString,appDelegate.sexString,appDelegate.deptString);

    }

现在这里是tableview部分。我有一个视图控制器我从插座放置Uitableview然后我从自定义UITableViewCell合并UITableViewCell。 这是我的tableview单元格编码:

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

    mobilePlanDetailsCellTableViewCell *mobPlan = (mobilePlanDetailsCellTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

       if (mobPlan == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"mobilePlanDetailsCellTableViewCell" owner:self options:nil];
        mobPlan = [nib objectAtIndex:0];
    }

    mobPlan.nameLabel.text = appDelegate.nameString;
    mobPlan.ageLabel.text =appDelegate.ageString;
    mobPlan.sexLabel.text =appDelegate.sexString;
    mobPlan.deptLabel.text =appDelegate.sexString;

    return mobPlan;
}

那么,您能告诉我如何将我的Web服务JSON中的所有数据加载到UITableViewCell中吗?

这是我的NSLog输出:

2015-01-07 10:41:00.145 AmslideMenu[430:5779] planArrayCount==>68
2015-01-07 10:41:00.145 AmslideMenu[430:5779] print==>0 
2015-01-07 10:41:00.146 AmslideMenu[430:5779]name==james,age==17,sex==male,dept==civil 
2015-01-07 10:41:00.146 AmslideMenu[430:5779] print==>1
2015-01-07 10:41:00.146 AmslideMenu[430:5779]name==rahul,age==17,sex==male ,dept==IT
2015-01-07 10:41:00.146 AmslideMenu[430:5779]print==>2 
2015-01-07 10:41:00.146 AmslideMenu[430:5779]name==ramesh,age==18,sex==male,dept==Mechanic

2 个答案:

答案 0 :(得分:0)

首先创建一个属性来保存数据,

@property (nonatomic, strong) NSArray *dataArray;

创建一个NSObject子类来表示一组属性,如name,age和all。

@interface User : NSObject

// Properties
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

然后在for循环中创建User对象并将其添加到dataArray

for (int i = 0 ; i<[planArray count]; i++) {

    recordResults = NO;
    User *user = [User alloc] init];
    user.nameString = [[[json valueForKey:@"plan_type"]valueForKey:@"name"]objectAtIndex:i];
    user.ageString=[[[json valueForKey:@"plan_type"]valueForKey:@"age"]objectAtIndex:i];
    user.sexString=[[[json valueForKey:@"plan_type"]valueForKey:@"sex"]objectAtIndex:i];
    user.deptString=[[[json valueForKey:@"plan_type"]valueForKey:@"dept"]objectAtIndex:i];

    [_dataArray addObject:user];
}

然后访问该数组以填充tableView。

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

{     static NSString * CellIdentifier = @&#34; Cell&#34 ;;

mobilePlanDetailsCellTableViewCell *mobPlan = (mobilePlanDetailsCellTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (mobPlan == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"mobilePlanDetailsCellTableViewCell" owner:self options:nil];
    mobPlan = [nib objectAtIndex:0];
}

User *user = [_dataArray objectAtIndex:indexPath.row];
mobPlan.nameLabel.text = user.nameString;
mobPlan.ageLabel.text = user.ageString;
mobPlan.sexLabel.text = user.sexString;
mobPlan.deptLabel.text = user.sexString;

return mobPlan;
}

答案 1 :(得分:0)

我认为这是因为您不了解如何存储值以及tableview的dataSource。

也许你的数据源和tableview是分开的。

您应该将值存储到数组中,就像现在一样,您可以在appDelegate中声明一个数组。

@property NSArray * planTypes;

执行此操作时,您可以更改为

NSMutableArray *dataSource = [NSMutableArray arrayWithCapacity:planArray.count];
for (int i = 0 ; i<[planArray count]; i++) {
    NSLog(@"print==>%d",i);
    recordResults = NO;
    NSString *nameString = [[[json valueForKey:@"plan_type"]valueForKey:@"name"]objectAtIndex:i];
    NSString *ageString=[[[json valueForKey:@"plan_type"]valueForKey:@"age"]objectAtIndex:i];
    NSString *sexString=[[[json valueForKey:@"plan_type"]valueForKey:@"sex"]objectAtIndex:i];
    NSString *deptString=[[[json valueForKey:@"plan_type"]valueForKey:@"dept"]objectAtIndex:i];
    generally, we create n modelClass like STPerson {@property name, xxx...},and value the person
    NSDictionary *dictionary = @{@"name":nameString, @"age":ageString,...};
    [dataSource addObject:dictionary];
}
the most important comes:
// you store values into appDelegate
appDelegate.planTypes = dataSource;

存储值后,您应该覆盖UITableViewDataSource

中的一些方法
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return appDelegate.planTypes.count;
}

修改你的cellForRow方法:

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

     mobilePlanDetailsCellTableViewCell *mobPlan = (mobilePlanDetailsCellTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (mobPlan == nil){
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"mobilePlanDetailsCellTableViewCell" owner:self options:nil];
        mobPlan = [nib objectAtIndex:0];
    }
    NSDictionary *plan = appDelegate.planTypes[indexPath.row];

    mobPlan.nameLabel.text = plan[@"name"];
    mobPlan.ageLabel.text = plan[@"age"];
    mobPlan.sexLabel.text = plan[@"sex"];
    mobPlan.deptLabel.text = plan[@"dept"];

    return mobPlan;
}