UIPickerView 无法显示 JSON 数组数据
Posted
技术标签:
【中文标题】UIPickerView 无法显示 JSON 数组数据【英文标题】:UIPickerView cannot display JSON array data 【发布时间】:2013-12-23 04:51:08 【问题描述】:这是我第一次做 ios 应用,所以我可能不知道一些看似简单的东西。请耐心等待我=)
基本上,我需要用我的 JSON 数据填充我的 UIPickerView。我已经成功解析了我的 JSON 数据并提取了我需要的内容并将它们放入 NSMutableArray。当我第一次尝试使用 UIPickerView 时,我使用了硬编码数组,一切正常。现在,当我尝试用我的 JSON 数组替换硬编码数组时,我不断得到一个空 JSON 数组。它的工作方式似乎 UIPickerView 试图在我的 JSON 数组被填充之前拉出所有内容。
我已尝试按照本网站其他地方的建议重新加载 UIPickerView,但它也无法正常工作。
以下是我的部分代码:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
dispatch_async(randomiserBgQ, ^
NSData* data = [NSData dataWithContentsOfURL:randomiserCatURL];
[self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
);
- (void)fetchedData:(NSData *)responseData
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSArray* randomiserCat = [json objectForKey:@"categories"];
self.randCatSel =[[NSMutableArray alloc] init];
NSLog(@"categories: %@", randomiserCat);
for (int i = 0; i < [randomiserCat count]; i++)
NSDictionary *dict = [randomiserCat objectAtIndex:i];
NSString* parent = [dict objectForKey:@"name"];
[self.randCatSel addObject:parent];
NSArray* childrenArray = [dict objectForKey:@"children"];
for (int i = 0; i < [childrenArray count]; i++)
NSDictionary* dict = [childrenArray objectAtIndex:i];
NSString* children = [dict objectForKey:@"name"];
[self.randCatSel addObject:children];
NSArray* grandchildrenArray = [dict objectForKey:@"grandchildren"];
for (int i = 0; i < [grandchildrenArray count]; i++)
NSDictionary* dict = [grandchildrenArray objectAtIndex:i];
NSString* grandchildren = [dict objectForKey:@"name"];
[self.randCatSel addObject:grandchildren];
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 1;
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component
return [self.randCatSel count];
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
return [self.randCatSel objectAtIndex:row];
如您所见,我尝试解析 JSON 数据的方式是,我使用了很长的方法,因为我在 JSON 数据中有几个级别的数组。如果有更快的方法(如 php 中的 foreach
),请也指出正确的方向。
到目前为止,我的 UIPickerView 得到一个空的 randCatSel
数组(我假设它在填充之前加载它)。
【问题讨论】:
json解析后可以使用[pickerViewObj reloadAllComponents];
。
你可以像 foreach 一样使用 for(NSDictionary *dic in randomiserCat)
在获取数据之前避免显示选择器。然后重新加载选择器。
[self.thePickerView reloadAllComponents];在这个方法中添加这一行 - (void)fetchedData:(NSData *)responseData 在 for 循环结束后结束。这个问题是由于你不是用数组的新数据加载你的pickerview
@Bhumeshwerkatre 你真是个天才!感谢您的帮助
【参考方案1】:
你好,试试这个,
- (void)fetchedData:(NSData *)responseData
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSArray* randomiserCat = [json objectForKey:@"categories"];
self.randCatSel =[[NSMutableArray alloc] init];
NSLog(@"categories: %@", randomiserCat);
for (int i = 0; i < [randomiserCat count]; i++)
NSDictionary *dict = [randomiserCat objectAtIndex:i];
NSString* parent = [dict objectForKey:@"name"];
[self.randCatSel addObject:parent];
NSArray* childrenArray = [dict objectForKey:@"children"];
for (int i = 0; i < [childrenArray count]; i++)
NSDictionary* dict = [childrenArray objectAtIndex:i];
NSString* children = [dict objectForKey:@"name"];
[self.randCatSel addObject:children];
NSArray* grandchildrenArray = [dict objectForKey:@"grandchildren"];
for (int i = 0; i < [grandchildrenArray count]; i++)
NSDictionary* dict = [grandchildrenArray objectAtIndex:i];
NSString* grandchildren = [dict objectForKey:@"name"];
[self.randCatSel addObject:grandchildren];
packerView=[[UIPickerView alloc] initWithFrame:CGRectMake(0, 280, 320, 200)];
packerView.delegate=self;
packerView.dataSource=self;
[self.view addSubview:packerView];
//add the picker view delegate and datasource in .h file. and set the frame as per your requirement.
希望这会对你有所帮助。
【讨论】:
我没有尝试您的答案,但我认为它是正确的,因为我之前看过代码的最后 3 行。不过reloadAllComponents
可以为你省下几行代码=)【参考方案2】:
正如这里的好人所指出的,我所要做的就是在我的fetchedData
方法中重新加载UIPickerView
。我之前把它放在viewDidLoad
=/
[pickerViewObj reloadAllComponents];
其中 pickerViewObj 是你自己的 UIPickerView。
【讨论】:
以上是关于UIPickerView 无法显示 JSON 数组数据的主要内容,如果未能解决你的问题,请参考以下文章
如何按字母顺序在 UIPickerView 中呈现 JSON 数组?