• iOS-封装UIPickerView


    创建类WJPickerView继承与UIView

    ProvinceModel是省市的model,包含属性

    @property (nonatomic, strong) NSString *provinceCode;

    @property (nonatomic, strong) NSString *provinceName;

    @property (nonatomic, strong) NSString *cityCode;

    @property (nonatomic, strong) NSString *cityName;

    WJPickerView.h

    #import <UIKit/UIKit.h>
    #import "ProvinceModel.h"
    /**
     *  回调block
     *
     *  @param currentModel 选中当前省的model
     */
    typedef void(^selectProvinceInfoBlock) (ProvinceModel * currentModel);
    @interface WJPickerView : UIView
    /**
     *  返回选择的数据
     *
     *  @param block 回调block
     */
    -(void)setSelectProvinceInfoBlock:(selectProvinceInfoBlock)block;
    /**
     *  显示PickerView
     */
    -(void)showPickerView;
    @end

    WJPickerView.m

    #import "WJPickerView.h"
    #define PROVINCE_CITYS @"citys"
    #define PROVINCE_AND_CITYS_NAME @"name"
    #define PROVINCE_AND_CITYS_CODE @"code"
    #define PICKER_VIEW_ROW_HEIGHT 30.0f
    #define PICKER_VIEW_COMPONENT_COUNT 2
    
    @interface WJPickerView ()<UIPickerViewDelegate,UIPickerViewDataSource>
    /**用来触发pickerView的textField*/
    @property(nonatomic,strong)UITextField *inputTextField;
    /**pickerView*/
    @property(nonatomic,strong)UIPickerView * provincePickerView;
    /**存储省市信息*/
    @property(nonatomic,strong)NSMutableArray * provinceArray;
    /**当前选中第一列的行数*/
    @property(nonatomic,assign)NSInteger currentFirstRow;
    /**当前选中第二列行数*/
    @property(nonatomic,assign)NSInteger currentSecondRow;
    
    @property(nonatomic,strong)selectProvinceInfoBlock  block;
    
    @end
    @implementation WJPickerView
    
    -(UITextField *)inputTextField{
        if (!_inputTextField) {
            _inputTextField = [[UITextField alloc] init];
        }
        return _inputTextField;
    }
    
    -(UIPickerView *)provincePickerView{
        if (!_provincePickerView) {
            _provincePickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 1000, 216)];
            _provincePickerView.showsSelectionIndicator = YES;
            _provincePickerView.dataSource = self;
            _provincePickerView.delegate = self;
        }
        return _provincePickerView;
    }
    
    -(instancetype)init{
        self = [super init];
        if (self) {
            /**从plist读取省市信息*/
            [self loadAllProvinceData];
            /**实例化PickerView并添加到inputView上*/
            [self addPickerViewToCurrentView];
        }
        return self;
    }
    
    #pragma mark - 从plist读取省市信息
    -(void)loadAllProvinceData{
        NSString * filePath = [[NSBundle mainBundle] pathForResource:@"province" ofType:@"plist"];
        _provinceArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    }
    
    #pragma mark - 实例化PickerView并添加到inputView上
    -(void)addPickerViewToCurrentView{
        [self addSubview:self.inputTextField];
        self.inputTextField.inputView = self.provincePickerView;
        self.inputTextField.inputView.backgroundColor = [UIColor whiteColor];
        /**往inputAccessoryView上添加ToolBar*/
        [self addToolBarItem];
    }
    
    #pragma mark - 往inputAccessoryView上添加ToolBar
    -(void)addToolBarItem{
        /**textView键盘定制回收按钮*/
        UIToolbar * toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 1000, 44)];
        
        UIBarButtonItem * item0 = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStyleDone target:self action:@selector(hiddenPickerView)];
        
        UIBarButtonItem * item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
        
        UIBarButtonItem * item2 = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:self action:@selector(tapSelectOkButton)];
        
        toolBar.items = @[item0,item1,item2];
        self.inputTextField.inputAccessoryView = toolBar;
        
    }
    
    #pragma mark - 数据回调
    -(void)setSelectProvinceInfoBlock:(selectProvinceInfoBlock)block{
        if (self.block == nil) {
            if (block != nil) {
                self.block = block;
            }
        }
    }
    
    #pragma mark - 显示pickerView
    -(void)showPickerView{
        [self.inputTextField becomeFirstResponder];
        [self.provincePickerView selectRow:_currentFirstRow inComponent:0 animated:NO];
        [self.provincePickerView selectRow:_currentSecondRow inComponent:1 animated:NO];
    }
    
    #pragma mark - 隐藏PickerView
    -(void)hiddenPickerView{
        [self.superview endEditing:YES];
    }
    
    #pragma mark - 点击完成
    -(void)tapSelectOkButton{
        
        [self hiddenPickerView];
        ProvinceModel * provinceModel = [[ProvinceModel alloc] init];
        if (_currentFirstRow < _provinceArray.count) {
            provinceModel.provinceName = [NSString stringWithFormat:@"%@", _provinceArray[_currentFirstRow][PROVINCE_AND_CITYS_NAME]];
            provinceModel.provinceCode = [NSString stringWithFormat:@"%@", _provinceArray[_currentFirstRow][PROVINCE_AND_CITYS_CODE]];
            NSArray * citys = _provinceArray[_currentFirstRow][PROVINCE_CITYS];
            if (_currentSecondRow < citys.count) {
                provinceModel.cityName = [NSString stringWithFormat:@"%@", citys[_currentSecondRow][PROVINCE_AND_CITYS_NAME]];
                provinceModel.cityCode = [NSString stringWithFormat:@"%@", citys[_currentSecondRow][PROVINCE_AND_CITYS_CODE]];
                
                if (self.block) {
                    self.block(provinceModel);
                }
            }
        }
    }
    
    #pragma mark - UIPickerViewDataSource
    /**列数*/
    -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
        return PICKER_VIEW_COMPONENT_COUNT;
    }
    
    /**行数*/
    -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
        if (component == 0 && _provinceArray != nil) {
            return _provinceArray.count;
        }
        
        if (component == 1 && _provinceArray != nil) {
            NSArray * citys = _provinceArray[_currentFirstRow][PROVINCE_CITYS];
            return citys.count;
        }
        return 0;
    }
    
    #pragma mark - UIPickerViewDelegate
    /**行高*/
    -(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
        
        return PICKER_VIEW_ROW_HEIGHT;
        
    }
    
    /**自定义PickerView显示的View*/
    -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
        
        UILabel *pickerLabel = [[UILabel alloc] initWithFrame:view.frame];
        pickerLabel.minimumScaleFactor = 1;
        pickerLabel.adjustsFontSizeToFitWidth = YES;
        pickerLabel.textAlignment = NSTextAlignmentCenter;
        pickerLabel.font = [UIFont boldSystemFontOfSize:15.0f];
        pickerLabel.text = [self pickerView:pickerView titleForRow:row forComponent:component];
        
        return pickerLabel;
        
    }
    
    /**每行每列设置title*/
    -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
        
        if (component == 0 && row < _provinceArray.count) {
            return _provinceArray[row][PROVINCE_AND_CITYS_NAME];
        }
        if (component == 1) {
            NSArray *citys = _provinceArray[_currentFirstRow][PROVINCE_CITYS];
            if (row < citys.count) {
                return citys[row][PROVINCE_AND_CITYS_NAME];
            }
            
        }
        return @"";
    }
    
    /**选中后的回调*/
    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
        
        if (component == 0) {
            _currentFirstRow = row;
        }
        if (component == 1) {
            _currentSecondRow = row;
        }
        
        [self.provincePickerView reloadAllComponents];
    }
    @end
  • 相关阅读:
    C# 中 finally 的用法
    相似度算法(转载)
    OpenCV 安装与调试
    win7 debug 工具
    wpf 登录时显示状态动态图
    C# 比较两张图片是否完全相同
    ABSD 基于架构的软件设计方法方法简介(摘抄)
    基于SQL Server的简单数据同步方案
    软件:产品和过程的统一(转)
    cpp extern 关键字用法
  • 原文地址:https://www.cnblogs.com/WJJ-Dream/p/5829787.html
Copyright © 2020-2023  润新知