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