UITableView方法被调用之前ViewDidLoad
问题描述:
我试图创建一个简单的天气应用程序,它使用JSON从OpenweatherMap获取数据并在UITableView中打印出来。但是,当我在下面执行此代码并在numberOfRowsInSection
方法中设置断点时,它将返回0行。不知怎的,viewDidLoad
方法在numberOfRowsInSection
方法之后被调用,这就是threeHoursForecast数组为空的原因。任何人都可以帮助我吗?UITableView方法被调用之前ViewDidLoad
static NSString * const BaseURLString = @"http://api.openweathermap.org/data/2.5/forecast?q=Houston";
@interface HPViewController()
@end
@implementation HPViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.threeHoursForecast = [[NSMutableArray alloc] init];
self.tableView.dataSource = self;
self.tableView.delegate = self;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:BaseURLString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSArray *data = [responseObject objectForKey:@"list"];
for (NSDictionary *forecastPerThreeHours in data)
[self.threeHoursForecast addObject:[[forecastPerThreeHours valueForKey:@"main"] valueForKey:@"temp"]];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (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.threeHoursForecast count];
}
答
您可以在调用完成处理程序后重新载入数据,这将解决问题。
[manager POST:BaseURLString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSArray *data = [responseObject objectForKey:@"list"];
for (NSDictionary *forecastPerThreeHours in data)
[self.threeHoursForecast addObject:[[forecastPerThreeHours valueForKey:@"main"] valueForKey:@"temp"]];
//Add this line
[self.TableView reloadData];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
答
post方法是异步的。您需要在连续的请求中添加[self.tableView reloadData];
。
+0
谢谢。它现在有效。我曾尝试重新加载数据,但我把它放在请求的成功块之外,所以它不起作用 – Harry 2014-10-02 16:10:31
答
manager POST:
是异步调用,因此您需要在获取JSON后重新载入数据。
[manager POST:BaseURLString parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSArray *data = [responseObject objectForKey:@"list"];
for (NSDictionary *forecastPerThreeHours in data)
[self.threeHoursForecast addObject:[[forecastPerThreeHours valueForKey:@"main"] valueForKey:@"temp"]];
// [NOTE]
[self.tableView reloadData];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
谢谢。它现在有效。我曾尝试重新加载数据,但我把它放在请求的成功块之外,所以它不起作用 – Harry 2014-10-02 16:10:10