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(, , , )];
_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的更多相关文章
- [iOS]封装单例类
[iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...
- IOS 封装功能和逻辑思想
在ios开发中,难免会用到helper的思想.这篇就简单讲解下关于helper的简单实用方法. 假设我们要做一个这样的界面: 会议分为四种情况: 未召开 正在召开 已结束 已取消 再看看逻辑关系: 编 ...
- iOS学习——UIPickerView的实现年月选择器
最近项目上需要用到一个选择器,选择器中的内容只有年和月,而在iOS系统自带的日期选择器UIDatePicker中却只有四个选项如下,分别是时间(时分秒).日期(年月日).日期+时间(年月日时分)以及倒 ...
- iOS 封装.framework 以及使用
.framework是什么? .framework是什么? 这个问题相信做iOS的都知道答案. 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝.微信SDK等等中的库,这些库可以给我们的开 ...
- iOS 封装SDK以及封装时bundle文件的处理
这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件. 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击File\New\Project, 选择iOS\ ...
- iOS封装功能生成 .framework
前言 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为 ...
- iOS中UIPickerView常见属性和方法的总结
UIPickerView是iOS中的原生选择器控件,使用方便,用法简单,效果漂亮. @property(nonatomic,assign) id<UIPickerViewDataSource&g ...
- IOS的UIPickerView 和UIDatePicker
1.UIPickerView的常见属性 //数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id<UIPikerViewData ...
- Xamarin.iOS + MvvmCross: UIPickerView data binding, SelectedItemChanged event
UI initialization: _pickerView = new UIPickerView(); _pickerView.ShowSelectionIndicator = true; _pic ...
- iOS :UIPickerView reloadAllComponets not work
编辑信息页面用了很多选择栏,大部分都用 UIPickerView 来实现.在切换数据显示的时候, UIPickerView 不更新数据,不得其解.Google 无解,原因在于无法描述自己的问题,想想应 ...
随机推荐
- Java HashMap 源代码分析
Java HashMap jdk 1.8 Java8相对于java7来说HashMap变化比较大,在hash冲突严重的时候java7会退化为链表,Java8会退化为TreeMap 我们先来看一下类图: ...
- 20155227 2016-2017-2 《Java程序设计》第二周学习总结
20155227 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 本周学习的第三章内容与以前学过的C语言有很多共通的地方,学习起来还是比较快的. 主要的内容有 ...
- Linux无法su到普通用户
无法通过su命令登录到普通用户 [root@linux-server ~]# su - tomcat su: cannot set user id: Resource temporarily unav ...
- IIS解决上传文件大小限制
目的:通过配置文件和IIS来解决服务器对上传文件大小的限制 1:修改配置文件(默认为4M 值的大小根据自己情况进行修改) <httpRuntime maxRequestLength=" ...
- Jmeter接口测试(三)接口测试实践
Jmeter 脚本编写一般分五个步骤: 1. 添加线程组 2. 添加 http 请求 3. 在 http 请求中写入接入 url.路径.请求方式和参数 4. 添加查看结果树 5. 调用接口.查看返回值 ...
- JMeter学习笔记(一) 工具的安装和基本介绍
因为网上的资料比较多,就不多描述了,在此引用了其他大神的文档,用于学习 这个文档中有比较详细的jmeter工具介绍: https://wenku.baidu.com/view/64f3a5f75901 ...
- HttpServletResponse 之 sendError( )
直接返回http 401状态,提示重新登录 response.sendError(401, "当前账户未登录或会话失效,请重新登录!) HTTP状态码列表: 100Continue继续.客户 ...
- Python解包参数列表及 Lambda 表达式
解包参数列表 当参数已经在python列表或元组中但需要为需要单独位置参数的函数调用解包时,会发生相反的情况.例如,内置的 range() 函数需要单独的 start 和 stop 参数.如果它们不能 ...
- 设计模式C++实现
准备写一系列笔记用来记录学习设计模式的过程,同时写出自己对几种主要的设计模式的理解,以及编码实现,同时总结. 主要参考书籍就是 <Head First Design Patterns>这本 ...
- CsvHelper文档-3写
CsvHelper文档-3写 不用做任何设置,默认的情况下,csvhelper就可以很好的工作了.如果你的类的属性名称和csv的header名称匹配,那么可以按照下面的例子写入: var record ...