我正在创建一个数组。该数组是来自网站的数据。我必须从中剥离一些东西并进行处理(基本上是公司信息,我将其简化为每个州之一)。allStatesFinalArray
是我要在表格视图中显示的数组。我可以在fetchedData语句中很好地记录它。但是无法将其放入表视图中。我从表视图日志中得到几个空响应。为什么?我知道我缺少什么。请帮忙。
//
// StateTableViewController.m
//
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#define kLatestKivaLoansURL [NSURL URLWithString:@"http://www.sensored.com"] //2
#import "StateTableViewController.h"
#import "ResViewController.h"
@interface StateTableViewController()
@end
@implementation StateTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(kBgQueue, ^{
NSData *data = [NSData dataWithContentsOfURL:kLatestKivaLoansURL];
[self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
});
}
////new code???
NSArray *allStatesFinalArray;
- (NSArray *)fetchedData:(NSData *)responseData
{
//parse out the json data
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSArray *getCompaniesArray = [json objectForKey:@"CompaniesCD"]; //2 get all company info
NSArray *getStatesArray = [getCompaniesArray valueForKey:@"state"];//get only states
NSSet *getOneStateSet = [NSSet setWithArray:getStatesArray];//get rid of duplicates
NSArray* allStatesFinalArray= [getOneStateSet allObjects];//nsset to array
NSLog(@"allstatesfinalarray log 1 : %@", allStatesFinalArray);//return allStatesFinalArray;
return allStatesFinalArray;// return an array of just one state
}
////end newcode???
#pragma mark - Table view data source
- (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 0;
NSLog(@"allstatesfinalarray log 2 : %@", allStatesFinalArray);//return allStatesFinalArray;
return [allStatesFinalArray count];
}
////NOTE ABOVE LOG RETURNS CORRECTLY!!!!
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//get log after this step of the array
NSLog(@"here is the list going to tableview: %@", allStatesFinalArray);
static NSString *CellIdentifier = @"stateCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [allStatesFinalArray objectAtIndex:indexPath.row];
return cell;
}
//////NOTE ABOVE LOG RETURNS SEVERAL NILLS????????
- (IBAction)done:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
最佳答案
您的代码是一团混乱。您有两种方法之间声明的变量:
////new code???
NSArray* allStatesFinalArray;
这使它成为应用程序的全局变量,这很不好。
您有2个变量称为
allStatesFinalArray
;全局应用程序,应该是实例变量,而fetchData内部的局部变量根本不应该存在。将该变量声明移至视图控制器类的标题:
@interface StateTableViewController()
{
NSArray* allStatesFinalArray;
}
@end
这使其成为实例变量。
现在将fetchData方法更改为不返回结果:
- (void)fetchedData:(NSData *)responseData
同样,摆脱
allStatesFinalArray
中局部变量fetchData
的修饰。使fetchData
方法将其结果保存到allStatesFinalArray
实例变量中。现在,作为
fetchData
方法的最后一行,调用表视图的reloadData
方法。关于ios - 用数组填充UITableView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32416931/