在TableViewController中使用NSMutableArray和JSON数据

时间:2014-11-07 09:20:07

标签: ios objective-c json xcode xcode6

下午好,

我试图在我的TableViewController中使用来自JSON输出的NSMutableArray并且我有点丢失,因为目前我可以将我的JSON数据存储在NSMutableArray中,并且我已经使用NSLog检查了内容没问题,但现在我必须在我的TableViewController中显示数据,以及我丢失时的数据。

我正在使用另一个使用NSArray的TableViewController示例,但现在我必须为NSMutableArray修改它。如果你可以帮我一些代码或给我一些例子或教程,我将不胜感激。

我知道在我的代码中可能有错误,因为我使用的是仅使用NSArray的旧示例,但我会告诉您,因为我不知道怎么做我需要和NSMutableArray一起工作,这就是我寻求帮助的原因。

如何在TableViewController中显示NSMutableArray?

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self fetchJson];
}

-(void)fetchJson {
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{

        NSString * urlString = [NSString stringWithFormat:@"http://website.com/service.php"];
        NSURL * url = [NSURL URLWithString:urlString];
        NSData * data = [NSData dataWithContentsOfURL:url];
        //NSError * error;
        //NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        // I advice that you make your carModels mutable array and initialise it here,before start working with json
        //self.carModels = [[NSMutableArray alloc] init];
        NSMutableArray *carModels=[[NSMutableArray alloc]init];
        NSMutableArray *carMakes=[[NSMutableArray alloc]init];
        NSMutableArray *carImages=[[NSMutableArray alloc]init];
        @try
        {
            NSError *error;

            NSMutableArray* json = [NSJSONSerialization
                                    JSONObjectWithData:data
                                    options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                                    error:&error];

            if (error)
            {
                NSLog(@"%@",[error localizedDescription]);

            }
            else
            {

                for(int i=0;i<json.count;i++)
                {
                    NSDictionary * jsonObject = [json objectAtIndex:i];
                    NSString* imagen = [jsonObject objectForKey:@"imagen"];
                    [carImages addObject:imagen];

                    NSDictionary * jsonObject2 = [json objectAtIndex:i];
                    NSString* user = [jsonObject2 objectForKey:@"user"];
                    [carMakes addObject:user];

                    NSDictionary * jsonObject3 = [json objectAtIndex:i];
                    NSString* images = [jsonObject3 objectForKey:@"date"];
                    [carModels addObject:images];
                }

            }
        }
        @catch (NSException * e)
        {
            NSLog(@"Exception: %@", e);
        }
        @finally
        {
            NSLog(@"finally");
            // That's showing the data "1, 2, 3".
            NSLog(@"models: %@", carModels);
            NSLog(@"makes: %@", carMakes);
            NSLog(@"images: %@", carImages);
        }
    }
    );
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [self.carModels count];
}

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

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

    // Configure the cell...
    cell.makeLabel.text = [_carMakes objectAtIndex: [indexPath row]];

    cell.modelLabel.text = [self.carModels objectAtIndex:[indexPath row]];

    UIImage *carPhoto = [UIImage imageNamed: [self.carImages objectAtIndex: [indexPath row]]];

    cell.carImage.image = carPhoto;

    return cell;
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"ShowCarDetails"])
    {
        CarDetailViewController *detailViewController =
        [segue destinationViewController];

        NSIndexPath *myIndexPath = [self.tableView
                                    indexPathForSelectedRow];

        detailViewController.carDetailModel = [[NSArray alloc]
                                               initWithObjects: [self.carMakes
                                                                 objectAtIndex:[myIndexPath row]],
                                               [self.carModels objectAtIndex:[myIndexPath row]],
                                               [self.carImages objectAtIndex:[myIndexPath row]],
                                               nil];
    }
}

感谢。

3 个答案:

答案 0 :(得分:0)

添加

[self.tableView reloadData]

获取并解析JSON后。

答案 1 :(得分:0)

声明NSMutableArray * jsonArray;作为全球

-(void)fetchJson {
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{

        NSString * urlString = [NSString stringWithFormat:@"http://website.com/service.php"];
        NSURL * url = [NSURL URLWithString:urlString];
        NSData * data = [NSData dataWithContentsOfURL:url];
        //NSError * error;
        //NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        // I advice that you make your carModels mutable array and initialise it here,before start working with json
        //self.carModels = [[NSMutableArray alloc] init];
        @try
        {
            NSError *error;
            [jsonArray removeAllObjects];
           jsonArray = [NSJSONSerialization
                                    JSONObjectWithData:data
                                    options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                                    error:&error];
        }
        @catch (NSException * e)
        {
            NSLog(@"Exception: %@", e);
        }
        @finally
        {
          [self.tableView reloadData]
        }
    }
    );
}

显示像这样的TableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [jsonArray count];
}

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

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

    // Configure the cell...
    cell.makeLabel.text = [[jsonArray objectAtIndex:indexPath.row] valueForKey:@"imagen"];
    cell.modelLabel.text = [[jsonArray objectAtIndex:indexPath.row] valueForKey:@"user"];
    UIImage *carPhoto = [[jsonArray objectAtIndex:indexPath.row] valueForKey:@"date"];
    cell.carImage.image = carPhoto;

    return cell;
}

答案 2 :(得分:0)

  • 每当您从不同的数组更改表数据时,只需在方法中添加[self.tableView reloadData]
  • 它将删除旧数据&amp;在您的tableview
  • 中显示新数据