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 数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Alamofire 使用 JSON 数组填充 UIPickerView 时遇到问题 |迅速
如何使用 JSON 数组填充 UIPickerView? [关闭]