UIPickerView 中的另一个 JSON 数据

Posted

技术标签:

【中文标题】UIPickerView 中的另一个 JSON 数据【英文标题】:Another JSON Data in UIPickerView 【发布时间】:2014-05-30 07:26:44 【问题描述】:

我查看了一些其他示例,但我似乎仍然无法弄清楚为什么我的pickerView 保持空白。

JSON 文件


"artstyle": [
             
             "id": 1001,
             "name": "Plain",
             "prefix": "plain"
             ,
             
             "id": 1002,
             "name": "Brushed",
             "prefix": "brushed"
             ,
             
             "id": 1003,
             "name": "Swirly",
             "prefix": "swirly"
             
             ]

.h

@interface FlipScrollViewController : UIViewController <UIPickerViewDataSource,UIPickerViewDelegate>

@property NSArray *artArray;

@end

.m

@interface FlipScrollViewController ()

@end

@implementation FlipScrollViewController


- (void)viewDidLoad

    [super viewDidLoad];

    //Getting the file path from the local bundle.
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"art" ofType:@"json"];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        NSData* data = [NSData dataWithContentsOfFile:filePath];
        [self performSelectorOnMainThread:@selector(fetchedData:)
                               withObject:data waitUntilDone:YES];
    );


- (void)fetchedData:(NSData *)responseData 
    //parse out the json data
    NSError* error;


    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    //self.artArray = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    //NSLog(@"get: %@", _artArray);


   //NSArray* shapeguide = [json objectForKey:(@"artstyle")];
    // this spits out the whole JSON file contents
    //NSLog(@"Guide: %@", shapeguide);

    //NSDictionary *art = [shapeguide objectAtIndex:0];
    //NSLog(@"Guide: %@", guide);
    // Displays the "name" value in the Label text

    //name.text = [NSString stringWithFormat:@"%@",[guide objectForKey:@"name"]];

    //self.artArray = [art objectForKey:@"name"];

  _artArray = [json objectForKey:(@"name")];
    //NSLog(@"Guide: %@", _artArray);


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    return 1;


- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    return [_artArray count];


-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    return [_artArray objectAtIndex:row];


/*
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    return 1;

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component


    //to do
    return [self.artArray count];


-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

    return [[self.artArray objectAtIndex:row] valueForKey:@"name"];


 */

@end

我知道我已经正确设置了委托,并且我知道 JSON 数据被正确吐出。我已经将 NSLogs 放在不同的地方进行检查。您可以从 .m 的部分内容中看到,我已经尝试了很多不同的方法来让这个东西正常工作。

我已经在这上面花了几天时间,我的头发都快用完了。另外,它看起来很臃肿,所以任何清理它的技巧都会受到赞赏。谢谢

【问题讨论】:

你不应该只扔掉你的 .h 和 .m 文件。这不是一个修复我的家庭作业的网站。描述你做了什么,只添加相关代码。此外,目前还不清楚什么不起作用。添加问题的屏幕截图。 【参考方案1】:
- (void)fetchedData:(NSData *)responseData 
//parse out the json data
NSError* error;


NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

NSLog(@"Guide: %@", json);

_artArray = [json objectForKey:@"artstyle"];

[<picker> reloadAllComponents];


-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
NSDictionary *dict = [_artArray objectAtIndex:row];
NSLog(@"dict: %@", dict);
return [dict objectForKey:@"name"];

【讨论】:

这很好用。虽然我不完全确定为什么。我得到了 reloadAllComponents 部分。看来你从我的数组中制作了一个字典来获取字符串?然后字符串填充选择器?如果您不介意简短的解释,那就太好了。再次感谢。 加载数组后,我们需要重新加载选取器控制器以填充数组中的内容。由于您正在从文件加载内容,因此在从文件内容加载数组之前,选择器可能会尝试从数组加载内容。此时数组中可能没有任何数据。所以它不会在选择器中显示任何内容。这就是为什么,每次数组加载内容后,我们都需要重新加载选择器组件。尝试在选择器委托中保留断点并运行应用程序。你可能知道它是如何工作的。【参考方案2】:

您正在以 ASYNCHRONOUS 形式检索 json 数据。

希望您在完成后忘记致电reloadAllComponents

例如:

- (void)fetchedData:(NSData *)responseData 
// ........All your stuff
[pickerView reloadAllComponents] ;

【讨论】:

以上是关于UIPickerView 中的另一个 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 将数据传递给容器视图

访问 JSON 文件以填充 UIPickerView

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

如何使用 JSON 数组填充 UIPickerView? [关闭]

UITableView 使用 UIPIckerView 滚动到特定部分?

UIPickerView 为空,数据源为 JSON 数组