从JSON解析

时间:2016-01-18 06:13:34

标签: ios objective-c iphone json uitableview

我在 XCODE 7.1上做了简单的应用。我只在tableview cell中显示2个标签和1个图像。我正在解析来自这个URL的数据。我只是在TableviewHere中加载数据我把 ViewController.m 文件的代码

    @interface ViewController ()

@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    activityIndicator.alpha = 1.0;
    [self.view addSubview:activityIndicator];
    activityIndicator.center = CGPointMake([[UIScreen mainScreen]bounds].size.width/2, [[UIScreen mainScreen]bounds].size.height/2);
    [activityIndicator startAnimating];//to start animating
    // Do any additional setup after loading the view, typically from a nib.


    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];


    NSURL *URL = [NSURL URLWithString:@"http://www.androidbegin.com/tutorial/jsonparsetutorial.txt"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            NSLog(@"Error: %@", error);
        } else {
            [activityIndicator stopAnimating];
            _responsedic = (NSDictionary*) responseObject;
            _Worldpopulation = [_responsedic valueForKey:@"worldpopulation"];
            _imageURL = [_Worldpopulation valueForKey:@"flag"];
            _country = [_Worldpopulation valueForKey:@"country"];
            _population = [_Worldpopulation valueForKey:@"population"];
            NSLog(@"Data:%@",_imageURL);
            NSLog(@"Population",_population);
            NSLog(@"Country",_country);
           // NSLog(@"%@",_MovieList);
            //NSLog(@"Array: %@",_imageURL);
            //NSLog(@"%@",responseObject);
        }
    }];
    [dataTask resume];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 10;
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString *Identifier = @"mycell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Identifier];
    // Set and load the images
    [cell.imageView sd_setImageWithURL:[_imageURL objectAtIndex:indexPath.row] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

        // Get rid of the activity indicator when the image has been loaded
    }];




    cell.textLabel.text = [_country objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = [_population objectAtIndex:indexPath.row];
    return  cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //NSString *rowValue = self.friends[indexPath.row+1];
    NSString *message = [[NSString alloc] initWithFormat:@"You selected %@",[_country objectAtIndex:indexPath.row]];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"YOU SELECT"
                                                    message:message
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}

我使用AFNetworking 3.0和SDWebImage进行图片加载。数据解析成功并显示在tableview中。我在下面附上截图

Simulator screenshot

问题是tableview单元格中没有显示所有数据的问题我还将tableview数据的每个单元格上的Alert对话框成功加载但未在单元格中显示。我搜索无处不在我无法找到解决方案我正在使用3G连接因此网速不是问题请有人帮忙。

2 个答案:

答案 0 :(得分:1)

尝试使用完成块中的更新数据重新加载表视图。

{{1}}

希望,它会帮助你。
感谢。

答案 1 :(得分:1)

enter image description here
1)解析数据并获取数据关联表

 -(void)ParseData
    {


            NSURLSession * session = [NSURLSession sharedSession];

            NSURL * url = [NSURL URLWithString: @"http://www.androidbegin.com/tutorial/jsonparsetutorial.txt"];

            //Create  URLReques
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                                   cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                               timeoutInterval:60.0];



            [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];



            // Set Method POST/GET
            [request setHTTPMethod:@"GET"];


            // Asynchronously Api is hit here

            NSURLSessionDataTask* dataTask=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {


                if (!error) //If error nil
                {
                    //Serialization  data
                    NSDictionary * json  = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

                    NSLog(@"json %@",json);

                    array=[json valueForKey:@"worldpopulation"];


                dispatch_async(dispatch_get_main_queue(), ^(void) {
                    if(array.count!=0)
                    {

                        //Reload table View
                        [_tblView reloadData];
                    }
                });

                }
                else
                {
                    //failure;
                }

            }];


            [dataTask resume] ; // Executed task

    }


2) Table View DataSource



 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {

        if(array.count!=0)
        {
            return [array count];
        }
        return 0;
    }


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

        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell;
        //= [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        cell.backgroundColor =[UIColor whiteColor];



        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        UILabel *lblCountry=(UILabel*)[cell viewWithTag:2];
        lblCountry.text= [[array objectAtIndex:indexPath.row]valueForKey:@"country"];

        UILabel *lblPopulation=(UILabel*)[cell viewWithTag:3];
        lblPopulation.text= [[array objectAtIndex:indexPath.row]valueForKey:@"population"];

        UIImageView *img = (UIImageView *)[cell viewWithTag:1];


        [img setImageWithURL:[NSURL URLWithString:[[array objectAtIndex:indexPath.row]valueForKey:@"flag"]]];

        return cell;
    }