UI基础学习之(十五):UIPickerView

使用UIPickerView可以在用户摄者时提供便利,尤其是固定的信息中:如省市的选择,性别的选择


数据源的获取:

#import <Foundation/Foundation.h>

@interface Province : NSObject

@property (copy, nonatomic)NSString *name;
@property (strong, nonatomic)NSArray *cities;

- (instancetype)initWithDic:(NSDictionary *)dic;

+ (instancetype)provinceWithDic:(NSDictionary *)dic;

@end

#import "Province.h"

@implementation Province

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}

- (instancetype)initWithDic:(NSDictionary *)dic
{
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dic];
    }
    return self;
}

+ (instancetype)provinceWithDic:(NSDictionary *)dic
{
    return [[self alloc] initWithDic:dic];
}

@end

#import "ViewController.h"
#import "Province.h"

@interface ViewController ()<UIPickerViewDataSource, UIPickerViewDelegate>

//数据源
@property (strong, nonatomic)NSArray *provinceData;

@property (strong, nonatomic)UIPickerView *pickView;

//显示选中的结果
@property (strong, nonatomic)UILabel *cityLabel;

@end

@implementation ViewController

//使用NSArray方式别人更改数据
- (NSArray *)provinceData
{
    if (_provinceData == nil) {
        NSMutableArray *provinceArr = [NSMutableArray array];
        NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil]];
        for (NSDictionary *dic in array) {
            Province *p = [Province provinceWithDic:dic];
            [provinceArr addObject:p];
        }
        _provinceData = provinceArr;
    }
    return _provinceData;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /*
     UIPickerView的属性和方法
     @property(nullable,nonatomic,weak) id<UIPickerViewDataSource> dataSource;                // 数据源
     @property(nullable,nonatomic,weak) id<UIPickerViewDelegate>   delegate;                  // 代理
     @property(nonatomic) BOOL  showsSelectionIndicator;  // 是否显示指示器,默认是NO
     
     @property(nonatomic,readonly) NSInteger numberOfComponents; //列的个数
     
     - (NSInteger)numberOfRowsInComponent:(NSInteger)component; //列中的行数
     
     - (CGSize)rowSizeForComponent:(NSInteger)component; //列中行的尺寸
     
     // 返回一个自定义的view,如选择国旗,view可以是:国家名+国旗
     - (nullable UIView *)viewForRow:(NSInteger)row forComponent:(NSInteger)component;
     
     - (void)reloadAllComponents; // 刷新全部列
     
     - (void)reloadComponent:(NSInteger)component; //刷新选中的列
     
     - (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;  // 选中时的动画效果
     
     - (NSInteger)selectedRowInComponent:(NSInteger)component; //获取选中列中的行号
     */

    CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
    
    //设置label
    self.cityLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 80, screenW, 30)];
    self.cityLabel.backgroundColor = [UIColor clearColor];
    self.cityLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:self.cityLabel];
    
    self.pickView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 150, screenW, 200)];
    self.pickView.delegate = self;
    self.pickView.dataSource = self;
    self.pickView.showsSelectionIndicator = YES;
    [self.view addSubview:self.pickView];
    
    //默认选中第0行0列  compmnent:列数  row:每列对应的行数
    [self pickerView:self.pickView didSelectRow:0 inComponent:0];
}

数据源和代理方法

//多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

//每列对应的行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == 0) {//多少个省份
        return self.provinceData.count;
    }else{
        //当前选中的哪个省
        //选中第一列中的行号
        NSInteger pIndex = [pickerView selectedRowInComponent:0];
        //取出对应的省会
        Province *p = self.provinceData[pIndex];
        return p.cities.count;
    }
}

//代理
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == 0) {
        
        Province *p = self.provinceData[row];
        
        return p.name;
        
    } else {
        
        NSInteger pIndex = [pickerView selectedRowInComponent:0];
        Province *p = self.provinceData[pIndex];
        
        return p.cities[row];
    }
}

//监听选中的方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //选中第一列
    if (component == 0) {
        //刷新第二列的数据
        [pickerView reloadComponent:1];
        //选择第二列中的第一行(默认显示)
        [pickerView selectRow:0 inComponent:1 animated:YES];
    }
    
    //获取选中的省 份名称
    NSInteger pIndex = [pickerView selectedRowInComponent:0];
    Province *p = self.provinceData[pIndex];
    
    //获取选中的城市名称
    NSInteger cIndex = [pickerView selectedRowInComponent:1];
    
    self.cityLabel.text = [NSString stringWithFormat:@"%@ %@", p.name, p.cities[cIndex]];
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值