创建类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. ls 的详细使用

    ls是list的缩写,list--清单 ls 是显示文件 如查看root下的所有信息 如果要以列表的形式显示文件详细信息可使用ls -all或ls -al(包括以“.“开头的隐藏文件) 如果你想查看某 ...

  2. ruby Rspec+jenkins+allure持续集成

    1.Allure2使用说明 2.ruby下载allure的gem gem install allure-rspec 3.修改源码 C:\Ruby23-x64\lib\ruby\gems\2.3.0\g ...

  3. Leecode刷题之旅-C语言/python-349两整数之和

    /* * @lc app=leetcode.cn id=371 lang=c * * [371] 两整数之和 * * https://leetcode-cn.com/problems/sum-of-t ...

  4. 什么是PHP7中的孤儿进程与僵尸进程

    什么是PHP7中的孤儿进程与僵尸进程 基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法 ...

  5. C语言——第一章,程序设计和C语言

    第一章,程序设计和C语言 一,程序和程序语言 程序:完成某项事物所预设的活动方式和活动过程 程序设计:人们描述(指程序)计算机要做的工作 程序设计语言及发展 1,机器语言    2,汇编语言    3 ...

  6. 数据结构与算法之Stack(栈)——in dart

    用dart 语言实现一个简单的stack(栈).栈的内部用List实现. class Stack<E> { final List<E> _stack; final int ca ...

  7. zabbix-3.2.3安装

    环境:lapp 操作系统: rhel7.0apache: apache-2.4数据库: postgresql-9.2.10php: php-5.4.16-21zabbix: zabbix-3.2.3 ...

  8. 防360TAB页面的样式页面

    今天给朋友做了一个仿照360新tab页面的效果,主要就是一些样式和JQUERY的应用,超级简单,现在把源码放出来 源码下载

  9. Mypwd 的解读与实现 20155202

    Mypwd 的解读与实现 20155202 linux下pwd命令的编写 实验要求: 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd ...

  10. 20145209刘一阳《JAVA程序设计》第一周课堂测试

    第一周课堂测试 1.下列不属于Java后继技术的是(D) A .Android B .JSP C .XML D .Python 2.下列关于Java语言特点的描述,正确的一组是(C) A .面向过程: ...