创建类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(, , , )];
_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(, , , )]; 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: animated:NO];
[self.provincePickerView selectRow:_currentSecondRow inComponent: 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 == && _provinceArray != nil) {
return _provinceArray.count;
} if (component == && _provinceArray != nil) {
NSArray * citys = _provinceArray[_currentFirstRow][PROVINCE_CITYS];
return citys.count;
}
return ;
} #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 = ;
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 == && row < _provinceArray.count) {
return _provinceArray[row][PROVINCE_AND_CITYS_NAME];
}
if (component == ) {
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 == ) {
_currentFirstRow = row;
}
if (component == ) {
_currentSecondRow = row;
} [self.provincePickerView reloadAllComponents];
}
@end

iOS-封装UIPickerView的更多相关文章

  1. [iOS]封装单例类

    [iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...

  2. IOS 封装功能和逻辑思想

    在ios开发中,难免会用到helper的思想.这篇就简单讲解下关于helper的简单实用方法. 假设我们要做一个这样的界面: 会议分为四种情况: 未召开 正在召开 已结束 已取消 再看看逻辑关系: 编 ...

  3. iOS学习——UIPickerView的实现年月选择器

    最近项目上需要用到一个选择器,选择器中的内容只有年和月,而在iOS系统自带的日期选择器UIDatePicker中却只有四个选项如下,分别是时间(时分秒).日期(年月日).日期+时间(年月日时分)以及倒 ...

  4. iOS 封装.framework 以及使用

    .framework是什么? .framework是什么? 这个问题相信做iOS的都知道答案. 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝.微信SDK等等中的库,这些库可以给我们的开 ...

  5. iOS 封装SDK以及封装时bundle文件的处理

    这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件. 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击File\New\Project, 选择iOS\ ...

  6. iOS封装功能生成 .framework

    前言 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为 ...

  7. iOS中UIPickerView常见属性和方法的总结

    UIPickerView是iOS中的原生选择器控件,使用方便,用法简单,效果漂亮. @property(nonatomic,assign) id<UIPickerViewDataSource&g ...

  8. IOS的UIPickerView 和UIDatePicker

    1.UIPickerView的常见属性 //数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id<UIPikerViewData ...

  9. Xamarin.iOS + MvvmCross: UIPickerView data binding, SelectedItemChanged event

    UI initialization: _pickerView = new UIPickerView(); _pickerView.ShowSelectionIndicator = true; _pic ...

  10. iOS :UIPickerView reloadAllComponets not work

    编辑信息页面用了很多选择栏,大部分都用 UIPickerView 来实现.在切换数据显示的时候, UIPickerView 不更新数据,不得其解.Google 无解,原因在于无法描述自己的问题,想想应 ...

随机推荐

  1. MySQL数据库实验:任务二 表数据的插入、修改及删除

    目录 任务二 表数据的插入.修改及删除 一.利用界面工具插入数据 二.数据更新 (一)利用MySQL命令行窗口更新数据 (二)利用Navicat for MySQL客户端工具更新数据 三.数据库的备份 ...

  2. 使用cmd时cd命令失效

    使用cmd时cd命令失效   近日使用cmd时总是出现无法cd到指定目录的情况 如下图所示 输入cd命令后依旧停留在原始路径 解决方法: 输入 cd D:\CE-5\Training_Sanple\n ...

  3. python格式化输出、逻辑表达式和字符编码

    格式化输出: %s  字符串占位符;%d 整数占位符 注意:如果前面有了占位符,那么后面所有的%都是占位,如果要输出“%”,需要使用转移符,即"%%" #定义三个变量 name = ...

  4. 改脚本之dbscaner

    默认的DBscaner只是用了ipy模块支持一个段的解析,但是我想让他加载脚本进行检测 所以,直接看 def __init__(self, target, thread): self.target = ...

  5. Linux - iconv 使用 - 处理 curl 乱码问题

    1. 概述 好久没有写博客了, 最近看了些东西, 但是不知道怎么输出 简单写点东西吧 2. 场景 最近发现一个网站, 时不时会更新电子书, 书还很好 网站有一个 排行榜, 会把近期更新的电子书, 都列 ...

  6. Enable CSS active pseudo styles in Mobile Safari

    http://alxgbsn.co.uk/2011/10/17/enable-css-active-pseudo-styles-in-mobile-safari/ document.addEventL ...

  7. 20155207王雪纯 2006-2007-2 《Java程序设计》第1 周学习总结

    20155207王雪纯 2006-2007-2 <Java程序设计>第1 周学习总结 教材学习内容总结 第一周重点学习第一章和第二章. 第一章总的来讲,我认为可以称之为本书的绪论,介绍了包 ...

  8. 20155211 2016-2017-2 《Java程序设计》第2周学习总结

    20155211 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 通过对教材的阅读,我理解到Java中对于整数,浮点数等类型的定义与c语言基本相同. 对字面常 ...

  9. # C语言假期学习笔记——6

    C语言假期学习笔记--6 数组 主要学习了一位数组和二维数组. 数组是一组具有相同类型的变量的集合.C语言程序通过元素的下标来访问数组中的元素.(下标从0开始) 一位数组 类型 数组名[元素个数] 二 ...

  10. ruby学习笔记(1)-puts,p,print的区别

    ruby学习笔记-puts,p,print的区别 共同点:都是用来屏幕输出的. 不同点:puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号):另外如果内容参数中有转义符,输出时将 ...