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 数组

如何按字母顺序在 UIPickerView 中呈现 JSON 数组?

用 json GET 创建的先前数组填充 UiPickerView(我得到“?”而不是数据)

如何让我的 UIPickerView 显示数组的所有元素

使用远程 JSON 数组填充 UIPIckerView

使用 Alamofire 使用 JSON 数组填充 UIPickerView 时遇到问题 |迅速