2013-12-23 155 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