`

新风作浪博客学习(九)两个UIPickerView控件间的数据依赖 .

    博客分类:
  • ios
ios 
阅读更多
  本篇实现功能是两个选取器的关联操作,滚动第一个滚轮第二个滚轮内容随着第一个的变化而变化,然后点击按钮触发一个动作;工程是在  代码实现UIPickerView   一文中基础上修改的,建工程就不多说,先把效果图贴出来:

[img]

[/img]

[img]

[/img]

1.首先在工程中建一个songInfo.plist文件,储存数据,
[img]

[/img]

添加的内容是:
[img]

[/img]






2.在ViewController.h定一个选取器pickerView对象,两个数组,存放选取器数据和一个字典,读取plist文件
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource>
{
//定义滑轮组建
    UIPickerView *pickerView;
//    储存第一个选取器的的数据
    NSArray *singerData;
//    储存第二个选取器
    NSArray *singData;
//    读取plist文件数据
    NSDictionary *pickerDictionary;

}

-(void) buttonPressed:(id)sender;

@end








3.在ViewController.m文件中ViewDidLoad完成初始化

首先定义两个宏定义,分别表示两个选取器的索引序号值,放在   #import "ViewController.h"后面

#define singerPickerView 0

#define singPickerView 1

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 216)];
//    指定Delegate
    pickerView.delegate=self;
    pickerView.dataSource=self;
//    显示选中框
    pickerView.showsSelectionIndicator=YES;
    [self.view addSubview:pickerView]; 
//    获取mainBundle
    NSBundle *bundle = [NSBundle mainBundle];
//    获取songInfo.plist文件路径
    NSURL *songInfo = [bundle URLForResource:@"songInfo" withExtension:@"plist"];
//    把plist文件里内容存入数组
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfURL:songInfo];
    pickerDictionary=dic;
//    将字典里面的内容取出放到数组中
    NSArray *components = [pickerDictionary allKeys];

//选取出第一个滚轮中的值    
    NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
    
    singerData = sorted;
    
//    根据第一个滚轮中的值,选取第二个滚轮中的值
    NSString *selectedState = [singerData objectAtIndex:0];
    NSArray *array = [pickerDictionary objectForKey:selectedState];
    singData=array;
        
    
//     添加按钮   
    CGRect frame = CGRectMake(120, 250, 80, 40);
    UIButton *selectButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    selectButton.frame=frame;
    [selectButton setTitle:@"SELECT" forState:UIControlStateNormal];
    
    [selectButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:selectButton];
    
}



按钮事件设置 :
-(void) buttonPressed:(id)sender
{
//    获取选取器某一行索引值
     NSInteger singerrow =[pickerView selectedRowInComponent:singerPickerView];
     NSInteger singrow = [pickerView selectedRowInComponent:singPickerView];
//   将singerData数组中值取出 
     NSString *selectedsinger = [singerData objectAtIndex:singerrow];
     NSString *selectedsing = [singData objectAtIndex:singrow];
     NSString *message = [[NSString alloc] initWithFormat:@"你选择了%@的%@",selectedsinger,selectedsing];
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" 
                                                    message:message
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles: nil];
    [alert show];

}






4.关于两个协议的代理方法 :
#pragma mark -
#pragma mark Picker Date Source Methods

//返回显示的列数
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
//    返回几就有几个选取器
    return 2;
}
//返回当前列显示的行数
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
 
    if (component==singerPickerView) {
        return [singerData count];
    }
    
        return [singData count];
    
}


#pragma mark Picker Delegate Methods

//返回当前行的内容,此处是将数组中数值添加到滚动的那个显示栏上
-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component==singerPickerView) {
        return [singerData objectAtIndex:row];
    }
    
        return [singData objectAtIndex:row];
    
    
}




-(void)pickerView:(UIPickerView *)pickerViewt didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//    如果选取的是第一个选取器
    if (component == singerPickerView) {
//        得到第一个选取器的当前行
        NSString *selectedState =[singerData objectAtIndex:row];
        
//        根据从pickerDictionary字典中取出的值,选择对应第二个中的值
        NSArray *array = [pickerDictionary objectForKey:selectedState];
        singData=array;
        [pickerView selectRow:0 inComponent:singPickerView animated:YES];
        
        
//        重新装载第二个滚轮中的值
        [pickerView reloadComponent:singPickerView];
    }
}



//设置滚轮的宽度
-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
    if (component == singerPickerView) {
        return 120;
    }
    return 200;
}



在这个方法中,-(void)pickerView:(UIPickerView *)pickerViewt didSelectRow:(NSInteger)row inComponent:(NSInteger)component ,我把(UIPickerView *)pickerView参数改成了(UIPickerView *)pickerViewt,因为我定义的pickerView对象和参数发生冲突,所以把参数给改了下;










  • 大小: 103.6 KB
  • 大小: 157.3 KB
  • 大小: 132 KB
  • 大小: 53.5 KB
分享到:
评论

相关推荐

    两个UIPickerView控件间的数据依赖

    当需要实现两个UIPickerView之间的数据依赖时,情况变得稍微复杂,但也是完全可行的。这种场景常见于当一个picker的选择会影响到另一个picker的显示内容或者范围。 首先,我们需要理解UIPickerView的基本工作原理。...

    Object-C-基于UIPickerView的列表选择.zip

    C-基于UIPickerView的列表选择.zipObject-C-基于UIPickerView的列表选择.zipObject-C-基于UIPickerView的列表选择.zipObject-C-基于UIPickerView的列表选择.zipObject-C-基于UIPickerView的列表选择.zipObject-C-...

    UIPickerView控件学习_点菜系统中的素材

    UIPickerView控件学习_点菜系统中的foods.plist文件

    UIPickerView控件学习_省市联动中的素材

    UIPickerView控件学习_省市联动中的素材(provinces.plist文件)

    IOS应用源码Demo-自定义风格UIPickerView-毕设学习.zip

    【标题】"IOS应用源码Demo-自定义风格UIPickerView-毕设学习"是一个针对iOS平台的应用程序源代码示例,重点展示了如何为UIPickerView定制独特样式,以适应不同设计需求或个人喜好。在iOS开发中,UIPickerView是常见...

    IOS应用源码——UIPickerView选择多个选项效果.zip

    在iOS开发中,UIPickerView是一个非常常见的组件,它用于展示一系列可滚动的行,用户可以从这些行中选择一个或多个选项。这个压缩包“IOS应用源码——UIPickerView选择多个选项效果.zip”显然是一个关于如何实现...

    ios-swift-demo10-选择框(UIPickerView)的用法.zip

    在iOS应用开发中,UIPickerView 是一个非常重要的控件,它用于展示一系列可滚动的选项,用户可以从中选择一个或多个值。本教程将详细解释如何在Swift中使用UIPickerView,通过“ios-swift-demo10-选择框...

    ios 使用UIPickerView时省市区全文件 .plist

    开发者需要实现这两个协议的方法,如`numberOfComponents(in:)`来定义选择器的列数,`pickerView(_:numberOfRowsInComponent:)`来设定每列的行数,以及`pickerView(_:titleForRow:forComponent:)`来提供每行显示的...

    ios-时间选择器 (UIPickerView).zip

    总之,“ios-时间选择器 (UIPickerView).zip”是一个关于如何使用UIPickerView创建时间选择器的示例项目,通过这个项目,开发者可以学习到如何自定义UIPickerView,实现时间选择功能,并处理相关的用户交互。...

    IOS源码应用Demo-UIPickerView选择多个选项效果.zip

    UIPickerView是苹果iOS SDK中的一个控件,它提供了一个垂直滚动的列表,用户可以通过滚动来选取一个或多个值。它常用于日期选择、时间选择或者下拉菜单等场景。 2. **多选功能实现**: 在iOS中,UIPickerView默认...

    iOS 控件基础- UIPickerView

    **UIPickerView**是iOS平台上一个重要的用户界面控件,用于展示一系列可滚动的选择项,通常用于让用户在多个选项中做出选择。它的工作原理类似于一个小型的轮盘,用户可以垂直滚动来查看并选择其中的某一项。在iOS...

    UIPickerView

    `UIPickerView`的运作离不开两个关键角色:数据源(`datasource`)和代理(`delegate`)。数据源负责提供`UIPickerView`要显示的数据,而代理则处理用户交互和视图的布局。 - 数据源方法: - `numberOfComponents...

    IOS应用源码——UIPickerView选择多个选项效果.rar

    在代码中创建时,通常会用到`UIPickerView`类的初始化方法,然后设置其代理和数据源,这两个协议(`UIPickerViewDelegate` 和 `UIPickerViewDataSource`)定义了如何与PickerView交互并提供数据。 描述中提到的...

    UIPickerView 城市两级选择

    1. 创建一个新的UIView子类,如`CityPickerView`,并添加两个`UIPickerView`实例作为其子视图。 2. 在`CityPickerView`类中实现`UIPickerViewDataSource`和`UIPickerViewDelegate`协议,以提供数据和处理用户交互。 ...

    UIPickerView小示例

    这两个协议定义了一系列方法,用来提供UIPickerView的数据和交互逻辑。 ```swift extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource { // 数据源方法 func numberOfComponents(in ...

    IOS自定义弹出UIPickerView或UIDatePicker(动画效果)

    在iOS开发中,UIPickerView和UIDatePicker是两种常用的组件,用于用户选择数据或设置日期。本教程将深入探讨如何在iOS应用中自定义这两种控件,并添加动画效果,以提升用户体验。以下是对这个主题的详细讲解: 首先...

    ios-UIPickerView.zip

    综上所述,`ios-UIPickerView.zip` 提供了一个使用Swift 3.0封装的UIPickerView示例,利用闭包简化了值传递,适合初学者理解和学习如何在iOS应用中集成和使用选择器。通过阅读和实践这个Demo,开发者可以更好地掌握...

Global site tag (gtag.js) - Google Analytics