【发布时间】: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 你真是个天才!感谢您的帮助
标签: ios objective-c json uipickerview