iOS学习笔记-025.UIPickerView——数据选择视图

UIPickerView——数据选择视图

一、作用和要求

1.作用

作用:负责从指定的数据源中选择数据

2.要求

要求:使用PickerView之前需要指定数据源

二、UIPickerView——数据源

• 数据源负责计算UIPickerView有多少列、多少行数据
• 数据源须遵守UIPickerViewDataSource协议,数据源方法如下:

1.返回总的列数

// 返回总的列数
- (NSInteger)numberOfComponentsInPickerView:

2.返回第component列的行数

// 返回第component列的行数
- (NSInteger)pickerView:numberOfRowsInComponent:

3.刷新数据方法

[pickerView reloadComponent:1];

一旦调用了这个方法,就会重新给数据源发送消息计算这列的行数、重新给代理发送消息获得这列的内容

三、UIPickerView——代理

1.常用代理

代理可以给UIPickerView提供具体的数据、监听UIPickerView的一些事件
代理必须遵守UIPickerViewDelegate协议,常用代理方法如下:

// 第component列第row行显示什么字符串内容
- (NSString *)pickerView:titleForRow:forComponent:
// 每当选择了新的一行就会调用
- (void)pickerView:didSelectRow:inComponent:

2.其他代理

1.代理方法扩展

// 第component列第row行显示什么样的UIView,最后一个view参数是用来性能优化的
- (UIView *)pickerView:viewForRow:forComponent:reusingView:
// 返回第component列每一行的高度
- (CGFloat)pickerView:rowHeightForComponent:

2.补充

自定义PickerView时,需要指定显示选择指示器属性
pickerView.showsSelectionIndicator = YES;

四、基础代码示例

//
//  ViewController.m
//  03_UIView13_UIPickerView01
//
//  Created by 杞文明 on 15/12/29.
//  Copyright © 2015年 杞文明. All rights reserved.
//

#import "ViewController.h"

@interface ViewController (){
    // 第一列的数据源
    NSArray *_colOne;
    // 第二列的数据源
    NSArray *_colTwo;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _colOne = @[@"a",@"b",@"c",@"d"];
    _colTwo = @[@"1",@"2",@"3",@"4",@"5",@"6"];

}

/**返回列数*/
- (NSInteger)numberOfComponentsInPickerView:(nonnull UIPickerView *)pickerView{
    return 2;
}

/**返回行数*/
- (NSInteger)pickerView:(nonnull UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if (component == 0) {
        return _colOne.count;
    } else {
        return _colTwo.count;
    }
}

/**row行component列显示的数据是*/
- (nullable NSString *)pickerView:(nonnull UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if(component==0){
        return _colOne[row];
    }else{
        return _colTwo[row];
    }
}

/**显示选中的数据*/
- (void)pickerView:(nonnull UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    NSInteger rowInCom1 = [pickerView selectedRowInComponent:0];
    NSInteger rowIncom2 = [pickerView selectedRowInComponent:1];
    NSLog(@"第一列选中的行数是 %ld,第二列选中的行数是 %ld",rowInCom1,rowIncom2);
    NSLog(@"第一列选中的值是  %@,第二列选中的值是  %@",_colOne[rowInCom1],_colTwo[rowIncom2]);
    NSLog(@" ");//换行作用
}

@end

五、基础示例图示

这里写图片描述

六、国旗代码示例

//
//  ViewController.m
//  03_UIView14_UIPickerView2_国旗
//
//  Created by 杞文明 on 15/12/29.
//  Copyright © 2015年 杞文明. All rights reserved.
//

#import "ViewController.h"

@interface ViewController (){
    NSArray * _dataList ;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self LoadData];
    // 初始化Picker的选项
//    [_pickerView selectRow:8 inComponent:0 animated:YES];
}
/**加载数据*/
-(void)LoadData{
    NSString * path = [[NSBundle mainBundle]pathForResource:@"flags" ofType:@"plist"];
    _dataList = [NSArray arrayWithContentsOfFile:path];
    NSLog(@"%@",_dataList);
}


/**选中row行component列*/
- (void)pickerView:(nonnull UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    NSDictionary *dict = _dataList[row];
    NSLog(@"选择的国家是 %@", dict[@"name"]);
}

/**返回多少列*/
- (NSInteger)numberOfComponentsInPickerView:(nonnull UIPickerView *)pickerView{
    return 1;
}
/**返回多少行*/
- (NSInteger)pickerView:(nonnull UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return _dataList.count;
}
/**加载内容 用自定义视图填充选择器的内容*/
- (nonnull UIView *)pickerView:(nonnull UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view{
    // 这里木有优化
    // 自定义一个UIView
    NSInteger viewHeight = 44;
    NSInteger labelWidth = 200;
    NSInteger viewWidth = 280;
    // 从数组中取出对应的数据字典
    NSDictionary *dict = _dataList[row];

    //1.创建一个view
    UIView * myView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, viewWidth, viewHeight)];
    [myView setBackgroundColor:[UIColor blueColor]];

    //2.创建label
    //2.1创建uilabel
    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, labelWidth, viewHeight)];
    //2.2设置数据
    [label setText:dict[@"name"]];
    [label setTextColor:[UIColor redColor]];
    [label setTextAlignment:NSTextAlignmentCenter];
    //2.3加载lable 到view
    [myView addSubview:label];

    //3.创建imageview
    //3.1创建UIImage
    UIImage * image = [UIImage imageNamed:dict[@"icon"]];
    //3.2创建UIImageView
    UIImageView * imageView = [[UIImageView alloc]initWithImage:image];
    [imageView setFrame:CGRectMake(labelWidth, 0, viewWidth-labelWidth, viewHeight)];
    //3.3加载imageview到myview
    [myView addSubview:imageView];

    //4.返回myView
    return myView;
}

/**返回列高*/
- (CGFloat)pickerView:(nonnull UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
    return 48;
}

@end

七、国旗图示

这里写图片描述

八、省市选择代码

//
//  ViewController.m
//  03_UIView15_UIPickerView03
//
//  Created by 杞文明 on 15/12/30.
//  Copyright © 2015年 杞文明. All rights reserved.
//

#import "ViewController.h"

@interface ViewController (){
    //省份
    NSArray* _province;
    //市
    NSDictionary* _city;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createPickerView];
    [self loadData];
}

/**创建ui*/
-(void)createPickerView{
    //1.实例化
    UIPickerView * pickerview = [[UIPickerView alloc]init];

    //2.设置控件的数据源
    [pickerview setDataSource:self];

    //3.设置代理
    [pickerview setDelegate:self];

    //4.设置选择选择器
    [pickerview setShowsSelectionIndicator:YES];

    //5.添加view中
    [self.view addSubview:pickerview];



}

/**加载数据*/
-(void)loadData{
    // 1. 省份
    _province = @[@"北京", @"河北", @"湖南"];

    // 2. 城市
    // 2.1 初始化城市字典
    _city = [NSMutableDictionary dictionary];

    // 2.2 实例化城市中的数据
    NSArray *city1 = @[@"东城", @"西城"];
    [_city setValue:city1 forKey:@"北京"];

    NSArray *city2 = @[@"石家庄", @"唐山", @"保定"];
    [_city setValue:city2 forKey:@"河北"];

    NSArray *city3 = @[@"长沙", @"郴州", @"衡阳"];
    [_city setValue:city3 forKey:@"湖南"];
}

/**行数*/
- (NSInteger)numberOfComponentsInPickerView:(nonnull UIPickerView *)pickerView{
    return 2;
}

/**列数*/
-(NSInteger)pickerView:(nonnull UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if(component==0){//第一列
        return _province.count;
    }else{
        NSInteger rowCom0 = [pickerView selectedRowInComponent:0];
        NSString * provinceName = _province[rowCom0];
        NSArray* city = _city[provinceName];
        return city.count;
    }
}

/**显示的视图*/
//-(nonnull UIView *)pickerView:(nonnull UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view{
//    
//}

- (nullable NSString *)pickerView:(nonnull UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if (component == 0) {
        return _province[row];
    } else {
        // 城市
        // 1. 获得省份列选择的行数
        NSInteger rowProvince = [pickerView selectedRowInComponent:0];
        // 2. 获得省份名称
        NSString *provinceName = _province[rowProvince];
        // 3. 获得城市的数组
        NSArray *citys = _city[provinceName];

        //        NSLog(@"%@", citys[row]);

        // 4. 返回城市数组中row的字符串内容
        return citys[row];
    }
}

/**选中的数据*/
- (void)pickerView:(nonnull UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

    [pickerView reloadComponent:1];

    NSInteger row1 = [pickerView selectedRowInComponent:0];
    NSInteger row2 = [pickerView selectedRowInComponent:1];

    NSString *provinceName = _province[row1];
    // 3. 获得城市的数组
    NSArray *citys = _city[provinceName];

    NSLog(@"%@~%@", _province[row1], citys[row2]);
}
@end

九、省市选择的图示

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值