2013-12-23 109 views
0

这是我第一次做iOS应用程序,所以我可能不知道一些看似简单的东西。请耐心等待我=)UIPickerView无法显示JSON数组数据

基本上,我需要用我的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数组(我认为它是在它被填充之前加载它)。

+3

你可以在json解析后使用'[pickerViewObj reloadAllComponents];''。 –

+0

与foreach一样,您可以使用for(NSDictionary * dic in randomiserCat) – mak

+0

避免在获取数据之前显示选取器。然后重新加载选取器。 – mak

回答

1

正如这里的精彩人物所指出的,我所要做的就是在我的fetchedData方法中重新加载UIPickerView。我以前把它放在viewDidLoad =/

[pickerViewObj reloadAllComponents]; 

哪里pickerViewObj是你自己的UIPickerView。

2

您好,请试试这个,

- (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. 

希望这会帮助你。

+0

我没有试过你的答案,但我认为这是正确的,因为我已经看过代码的最后3行。然而,'reloadAllComponents'可以为你节省一些代码行=) – SilverHood

+0

是的,这也是事实。 – hpp