无法将json数据加载到tableView

时间:2016-05-04 01:04:27

标签: ios objective-c uitableview dictionary

我正在尝试做天气应用

 #import "LocationTableViewController.h"

@interface LocationTableViewController (){

    NSArray *hourlyData;
    NSArray *dailyData;
}


@end

@implementation LocationTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *str = @"https://api.forecast.io/forecast/cd8edc928426f2ac3e341441c7a9c6d3/37.8267,-122.423";
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:str]];

    NSDictionary *dataFromWeb = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

我接受了一个json查询,该查询提供每小时和每日数据,然后将其转换为字典。在这里,我创建了两个字典,即每小时字典和日常字典,其中包含温度,湿度等字段

我的主要目标是通过将它们加载到表格视图中,每小时和每天使用这两个词典来创建天气应用程序。

    NSDictionary *hourlyDict = [dataFromWeb objectForKey:@"hourly"];
    hourlyData = [hourlyDict objectForKey:@"data"];

    NSDictionary *dailyDict = [dataFromWeb objectForKey:@"daily"];
    dailyData = [dailyDict objectForKey:@"data"];

   NSLog(@"%@", [[dailyData objectAtIndex:0] objectForKey:@"humidity"]);
}

在这里,我成功创建了两个字典,并尝试使用NSlog来正常工作。

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

我觉得我的问题从将字典加载到tableView中开始。

1)在故事板中,我将表视图嵌入到NavigationView中。 2)我将表格查看内容作为动态协议 3)将单元标识符命名为单元格

我认为问题始于将数据发送到表中。基本上我的应用程序应包含3个部分摘要,每小时数据和每日数据。但我只是想现在只尝试每日数据。

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}

由于我不想要任何部分,我删除了这个号码。部分,但它告诉我错误,所以保持它返回并返回0.,我也尝试使它1,但应用程序崩溃。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 NSLog(@"hello");
     return dailyData.count;
}

这里我希望列作为字典中的no.of行,所以我创建了dailyData.count。

这里开始主要问题,这个 - (UITableViewCell *)tableView:........函数没有被调用,我试过NSlog一条消息,它没有显示出来

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

NSLog(@"hello");

   cell.textLabel.text = [[dailyData objectAtIndex:indexPath.row]objectForKey:@"sunsetTime"];


    return cell;
}
请问有人可以帮助我。提前致谢。我是编程新手。

这里我附上了Google Drive link for project

5 个答案:

答案 0 :(得分:1)

//部分应为1而不是0

CStr (CurrentFieldValue, "#,##,##,##,##,###.00")

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } 具有以下无法指定为单元格标签文本的字典,您必须为单元格标签文本指定一些字符串值

[dailyData objectAtIndex:indexPath.row]

{ apparentTemperatureMax = "60.49"; apparentTemperatureMaxTime = 1462316400; apparentTemperatureMin = "52.96"; apparentTemperatureMinTime = 1462276800; cloudCover = "0.92"; dewPoint = "50.37"; humidity = "0.8100000000000001"; icon = "partly-cloudy-day"; moonPhase = "0.89"; ozone = "351.23"; precipIntensity = 0; precipIntensityMax = 0; precipProbability = 0; pressure = "1014.68"; summary = "Mostly cloudy throughout the day."; sunriseTime = 1462281126; sunsetTime = 1462331002; temperatureMax = "60.49"; temperatureMaxTime = 1462316400; temperatureMin = "52.96"; temperatureMinTime = 1462276800; time = 1462258800; visibility = "8.779999999999999"; windBearing = 275; windSpeed = "5.83"; } 您正在为tableViewCell标签分配字典。如果你想要特定的键值,那么检查下面的代码

cell.textLabel.text = [dailyData objectAtIndex:indexPath.row];

答案 1 :(得分:0)

要解决您的问题,您需要将部分数量设置为1(您必须始终至少有1个部分才能显示任何内容)。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

当您将节数设置为1时,您遇到崩溃的原因是因为您尝试将NSDictionary用作NSString。您需要从NSDictionary获取NSString。以下代码将从该行的每日数据中获取摘要并显示摘要。

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

    NSDictionary *rowData = [dailyData objectAtIndex:indexPath.row];
    cell.textLabel.text = [rowData objectForKey:@"summary"];

    return cell;
}

答案 2 :(得分:0)

我试图将浮动传递到我的表格单元格文本中,这是错误的。我们必须只将文本传递给那个,但我试图插入浮点值。现在我传递一些文本值,它工作正常

谢谢大家的支持。再次感谢你

答案 3 :(得分:0)

使用下面的代码,你的代码对我有用,

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 NSLog(@"hello");
     return dailyData.count;
}


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

    NSLog(@"hello %@",[[dailyData objectAtIndex:indexPath.row] objectForKey:@"humidity"]);

   cell.textLabel.text = [NSString stringWithFormat:@"%@",[[dailyData objectAtIndex:indexPath.row] objectForKey:@"humidity"]];

    return cell;
}

您的输出如下,

enter image description here

打印湿度值

希望它有用

答案 4 :(得分:-2)

您必须显示不要显示数据,因为您的dailyDataNSArray!如何使用数组作为字符串?建议您使用模型来存储数据。< / p>

    NSDictionary *hourlyDict = [dataFromWeb objectForKey:@"hourly"];
    hourlyData = [hourlyDict objectForKey:@"data"];

    NSDictionary *dailyDict = [dataFromWeb objectForKey:@"daily"];
    dailyData = [dailyDict objectForKey:@"data"];


    for (id  obj in hourlyData) {
        newsModel *model=[[newsModel alloc]init ];
        model.name=obj[@"summary"];
        [_dataArray addObject:model];
    }

    NSLog(@"%@", [[dailyData objectAtIndex:0] objectForKey:@"humidity"]);

在表格视图中委托:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIde=@"cell";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIde];
    if (!cell) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIde ];

    }
    newsModel *model=_dataArray[indexPath.row];
    cell.textLabel.text=model.name;
    return cell;

}