【问题标题】:UIPickerView cannot display JSON array dataUIPickerView 无法显示 JSON 数组数据
【发布时间】: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


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多