使用带有更改值的选择器视图的 JSON

Posted

技术标签:

【中文标题】使用带有更改值的选择器视图的 JSON【英文标题】:Using JSON with pickerview that changes values 【发布时间】:2014-04-24 10:39:55 【问题描述】:

我对 Xcode 和 Obj-C 编程还是很陌生,所以提前道歉。

使用此站点和一些其他站点,我已经设法将Pickerview一起划分了两个组件,在选择第一个组件中的一个选项时,第二个组件被自动更改为显示与第一个组件中选择的选项相关的选项. 我开始工作的示例选择器视图使用这些国家的国家和足球俱乐部,例如如果您在第一个组件中选择英格兰,您会在第二个组件中获得英国球队列表,如果您在第一个组件中选择西班牙,您会在第二个组件中获得西班牙团队列表,依此类推。

目前所有这些国家和团队都在 Xcode 中进行了硬编码。 我不想做的是将这些县和团队存储在 mysql 数据库中,然后使用 php 将这些记录发送到应用程序。之后我想在一个数组中使用这些 json 记录并将它们显示在选择器视图上。

我将 json 数据导入应用程序没有问题,但是在应用程序上使用带有选择器视图的 json 时,我遇到了一些问题。我没有运气让选择器视图与 json 数组一起使用,它开始变得非常令人沮丧

这是我目前在硬编码的县和团队中拥有的 pickerview 的代码:

#import "ViewController.h"

@interface ViewController ()

NSMutableArray *Nations;
NSMutableArray *England;
NSMutableArray *Espana;
NSMutableArray *Netherlands;
NSMutableArray *Germany;
NSMutableArray *Italy;

// Define keys
NSString *club;


@end

@implementation ViewController

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Nations = [[NSMutableArray alloc]initWithObjects:@"England",@"Espana",@"Netherlands",@"Germany",@"Italy", nil];

England=[[NSMutableArray alloc]initWithObjects:@"Arsenal",@"Chelsea",@"Manchester City",@"Manchester United",@"Liverpool",@"Tottenham",@"Fulham City",@"Stoke City",@"Sunderland",@"NewCastle United",@"Blackburn Rovers",@"Southampton",@"Wolvers",@"Aston Villa", nil];

Espana = [[NSMutableArray alloc]initWithObjects:@"Barcelona",@"Real Madrid",@"Valencia",@"Athletico Madrid",@"Athletico Balbao",@"Getafe CF",@"Sevilla CF", nil];

Netherlands = [[NSMutableArray alloc]initWithObjects:@"Celtics",@"Ajax",@"Amesterdam", nil];

Germany = [[NSMutableArray alloc]initWithObjects:@"Bayern Munich",@"Bermen",@"Fiorentina",@"Pampas",@"Nord", nil];

Italy = [[NSMutableArray alloc]initWithObjects:@"AC Milan",@"Inter Milan",@"Juventus", nil];




- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

    return 2;


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

    if(component ==0)
    
        return [Nations count];
    
    else 
        if ([club isEqualToString:@"Espana"]) 
            return [Espana count];
        
        if ([club isEqualToString:@"Germany"]) 
            return [Germany count];
        
        if ([club isEqualToString:@"Netherlands"]) 
            return [Netherlands count];
        
        if ([club isEqualToString:@"Italy"]) 
            return [Italy count];
        
        else  
            return [England count];
        
    

    return 0;


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

    if(component ==0)
    
        return [Nations objectAtIndex:row];
    
    else 
        if ([club isEqualToString:@"Espana"]) 
            return [Espana objectAtIndex:row];
        
        if ([club isEqualToString:@"Germany"]) 
            return [Germany objectAtIndex:row];
        
        if ([club isEqualToString:@"Netherlands"]) 
           return [Netherlands objectAtIndex:row];
        
        if ([club isEqualToString:@"Italy"]) 
            return [Italy objectAtIndex:row];
        
        else  
            return [England objectAtIndex:row];


        
    

    return 0;



-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

    if (component == 0) 
        club=[[NSString alloc] initWithFormat:@"%@" , [Nations objectAtIndex:row]];
        [pickerView reloadComponent:1];
    
 

- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


 - (void)dealloc 


@end

【问题讨论】:

【参考方案1】:

到底发生了什么?您的代码看起来非常好。

您是否设置了UIPickerView

viewDidLoad 中应该是这样的:

UIPickerView * mainPickerView = [[UIPickerView alloc] init];
[mainPickerView setShowsSelectionIndicator:YES];
mainPickerView.backgroundColor = [UIColor whiteColor];
mainPickerView.dataSource = self;
mainPickerView.delegate = self;

确保 datasourcedelegate 已设置。还要确保你有正确的框架。而且,总体而言,如果您的UIPickerView 可见,请确保在从服务器获取信息后致电[mainPickerView reloadAllComponents];

欢迎提问。

所以你基本上使用一些网络框架来获取你的 JSON 服务器答案,90% 的时间将是一个看起来像这样的 NSDictionary:

NSDictionary *result=[NSJSONSerialization JSONObjectWithData:resultData options:kNilOptions error:&error];

在该字典中,您有一些实际上是NSArrays 的对象。只需将您现有的 NSArrays 替换为它们,重新加载您的 UIPicker 即可。

【讨论】:

不,上面显示的代码没有任何问题,可以正常工作。 我想要的是更改此代码,以便它使用 json 数据而不是国家和团队的普通数组。我的问题是我不知道该怎么做。 @user3406608 那么这不是 UIPicker 的问题,而是您解析 JSON 的问题。这是一个不同答案的问题。我会尽快更新我的。 会是这个样子吗? ***.com/questions/9868096/save-json-data-in-nsarray/… @user3406608 是的,事实上你可以对 JSON 中的数据做任何你想做的事情。【参考方案2】:

这很令人沮丧,因为很难跟踪不同的数组。 我建议您将数据结构更改为 NSDictionary 的字典。 您的 JSON 应该看起来一样。

viewDidLoad

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


self.listOfclubs = 
@
 @"Nations ":@[@"England",@"Espana",@"Netherlands",@"Germany",@"Italy"]
 @"England":@[@"Arsenal",@"Chelsea",@"Manchester City",@"Manchester United",@"Liverpool",@"Tottenham",@"Fulham City",@"Stoke City",@"Sunderland",@"NewCastle United",@"Blackburn Rovers",@"Southampton",@"Wolvers",@"Aston Villa"],
 @"Espana ":@[@"Barcelona",@"Real Madrid",@"Valencia",@"Athletico Madrid",@"Athletico Balbao",@"Getafe CF",@"Sevilla CF"],
 @"Netherlands":@[@"Celtics",@"Ajax",@"Amesterdam"],
 @"Germany  ":@[@"Bayern Munich",@"Bermen",@"Fiorentina",@"Pampas",@"Nord"],
 @"Italy  ":@[@"AC Milan",@"Inter Milan",@"Juventus"],
;

numberOfRowsInComponent

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

    return [listOfclubs objectForKey:club];

titleForRow

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

    return [[listOfclubs objectForKey:club] objectAtIndex:row];

看看这段代码与之前的代码相比有多么简单和灵活。

【讨论】:

以上是关于使用带有更改值的选择器视图的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用开关更改选择器视图的值

选择器视图默认行未使用 swift 2 更改

快速使用 JSON 数据填充选择器视图的最佳方法是啥?

带有 JSON 的 JQuery 选择器

jquery奇数偶数选择器

jquery奇数偶数选择器