自定义UIDatePickView

来源:互联网 发布:淄博优化网站排名 编辑:程序博客网 时间:2024/05/16 12:02
////  ViewController.m//  05-UIDatePicker-键盘处理////  Created by Itcast.GuangZhou on 15/10/6.//  Copyright (c) 2015年 itcast. All rights reserved.//#import "ViewController.h"#import "HMProvince.h"@interface ViewController ()<UIPickerViewDataSource,UIPickerViewDelegate,UITextFieldDelegate>// 生日输入框@property (weak, nonatomic) IBOutlet UITextField *birthField;// 省份输入框@property (weak, nonatomic) IBOutlet UITextField *provinceField;// 日期选择器@property (strong, nonatomic) UIDatePicker *datePicker;// 工具条@property (strong, nonatomic) UIToolbar *toolBar;// 省份选择器@property (strong, nonatomic) UIPickerView *pickerView;// 所有省份数据@property (strong, nonatomic) NSArray *provinces;// 记录选中的省份@property (strong, nonatomic) HMProvince *selectedProvince;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // 设置文本输入框的代理    self.birthField.delegate = self;    self.provinceField.delegate = self;    // 默认显示当天时间    [self datePickerValueChanged:nil];}#pragma mark - 懒加载控件- (UIDatePicker *)datePicker {    if (_datePicker == nil) {        NSLog(@"创建了日前选择器");        // 创建日期选择器:可以不设置frame        _datePicker = [[UIDatePicker alloc] init];        // 设置时区        _datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh_CN"];                // 设置时间模式        _datePicker.datePickerMode = UIDatePickerModeDate;                // 设置最小时间 (20年前)        _datePicker.minimumDate = [NSDate dateWithTimeIntervalSinceNow:-(20 * 365 * 24 * 60 * 60)];        // 设置最大时间 (20年后)        _datePicker.maximumDate = [NSDate dateWithTimeIntervalSinceNow:(20 * 365 * 24 * 60 * 60)];                // 设置时间间隔        // 设置的值必须能够被60整除//        _datePicker.minuteInterval = 30;                // 监听时间值改变事件        [_datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];    }    return _datePicker;}- (UIToolbar *)toolBar {    if (_toolBar == nil) {        // 创建工具条        _toolBar = [[UIToolbar alloc] init];        // 设置frame:只要设置高度即可        _toolBar.frame = CGRectMake(0, 0, 0, 44);        // 设置背景颜色//        _toolBar.backgroundColor = [UIColor redColor];        _toolBar.barTintColor = [UIColor orangeColor];        _toolBar.tintColor = [UIColor whiteColor];        // 创建item        // 上一个        UIBarButtonItem *lastItem = [[UIBarButtonItem alloc] initWithTitle:@"上一个" style:UIBarButtonItemStylePlain target:self action:@selector(lastItemClick)];                // 下一个        UIBarButtonItem *nextItem = [[UIBarButtonItem alloc] initWithTitle:@"下一个" style:UIBarButtonItemStylePlain target:self action:@selector(nextItemClick)];                // 创建弹簧        UIBarButtonItem *flexibleSpaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];                // 完成        UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStylePlain target:self action:@selector(doneItemClick)];                _toolBar.items = @[lastItem,nextItem,flexibleSpaceItem,doneItem];//        [_toolBar addSubview:lastItem];    }    return _toolBar;}- (UIPickerView *)pickerView {    if (_pickerView == nil) {        // 创建选择器        _pickerView = [[UIPickerView alloc] init];        // 设置数据源和代理        _pickerView.dataSource = self;        _pickerView.delegate = self;    }    return _pickerView;}- (NSArray *)provinces {    if (_provinces == nil) {        NSLog(@"加载了省份数据");        _provinces = [HMProvince provinces];    }    return _provinces;}#pragma mark - UIPickerViewDataSource 数据源方法// 两列- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {    return 2;}- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {    if (component == 0) { // 省份列        return self.provinces.count;    } else { // 城市列        // 获得省份所在的行号        NSInteger provinceIndex = [pickerView selectedRowInComponent:0];        // 根据索引获得省份        HMProvince *province = self.provinces[provinceIndex];        return province.cities.count;    }}#pragma mark - UIPickerView 代理方法- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {    if (component == 0) { // 省份列        // 根据row获得对应的省份        HMProvince *province = self.provinces[row];        return province.name;    } else if (component == 1) { // 城市列        // 获得省份所在的行号        NSInteger provinceIndex = [pickerView selectedRowInComponent:0];        // 根据索引获得省份        HMProvince *province = self.provinces[provinceIndex];        // 获得省份对应的所有城市        NSArray *cities = province.cities; // 10 11//        NSLog(@"row = %zd,城市个数= %zd,省名 = %@",row,cities.count,province.name);        if (cities.count > row) {            return cities[row];        }        return nil;    }    return @"";}#pragma mark - UITextField 代理方法- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {    if (textField.inputView) return YES;        if (self.birthField == textField) { // 生日         // 自定义输入框的键盘        self.birthField.inputView = self.datePicker;        // 设置键盘输入辅助附件        self.birthField.inputAccessoryView = self.toolBar;    } else if(self.provinceField == textField){        self.provinceField.inputAccessoryView = self.toolBar;        self.provinceField.inputView = self.pickerView;        // 默认选中第一个省份        self.selectedProvince = self.provinces[0];    }    return YES;}// 监听pickerView选择行事件- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {    if(component == 0) { // 滚动的是省份列        // 刷新城市列        [pickerView reloadComponent:1];        // 主动选择第1列的第0行        [pickerView selectRow:0 inComponent:1 animated:YES];        // 获得选中的省份        self.selectedProvince = self.provinces[row];    }    // 设置身份文本输入框的内容    self.provinceField.text = [NSString stringWithFormat:@"%@ %@",self.selectedProvince.name,self.selectedProvince.cities[(component == 0) ? 0 :row]];}#pragma mark - 监听时间值的改变- (void)datePickerValueChanged:(UIDatePicker *)datePicker{    // 获得时间    NSDate *date = datePicker == nil ? [NSDate date]:datePicker.date;    // 格式化时间    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];    // 时间格式    fmt.dateFormat = @"yyyy-MM-dd";    // 将时间转换成字符串    self.birthField.text = [fmt stringFromDate:date];}#pragma mark - 监听item的点击- (void)lastItemClick{    if ([self.provinceField isFirstResponder]) {        [self.birthField becomeFirstResponder];    }}- (void)nextItemClick{    if([self.birthField isFirstResponder]) {        // 如果是生日文本输入框是第一个响应者        [self.provinceField becomeFirstResponder];    }}- (void)doneItemClick{    if (self.provinceField.text.length == 0 && [self.provinceField isFirstResponder]) {        // 设置省份内容        self.provinceField.text = [NSString stringWithFormat:@"%@ %@",self.selectedProvince.name,self.selectedProvince.cities[0]];    }    // 隐藏键盘    [self.view endEditing:YES];}@end
<pre name="code" class="objc">// 模型#import <Foundation/Foundation.h>@interface HMProvince : NSObject/** *  省份对应的所有城市 */@property (strong, nonatomic) NSArray *cities;/** *  省份的名字 */@property (copy, nonatomic) NSString *name;+(instancetype)provinceWithDict:(NSDictionary *)dict;- (instancetype)initWithDict:(NSDictionary *)dict;+(NSArray *)provinces;@end


<pre name="code" class="objc">// 模型#import "HMProvince.h"@implementation HMProvince- (instancetype) initWithDict:(NSDictionary *)dic{    if (self=[super init]) {        [self setValuesForKeysWithDictionary:dic];    }    return self;}+ (instancetype) provinceWithDict:(NSDictionary *)dic{    return [[self alloc] initWithDict:dic];}+ (NSArray *) provinces{    NSArray *sourceArr=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil]];    NSMutableArray *desArr=[NSMutableArray array];    //循环遍历字典数组,字典转模型    for (NSDictionary *dic in sourceArr) {        //每一个字典对应着一个模型对象        HMProvince *provincer=[HMProvince provinceWithDict:dic];        [desArr addObject:provincer];    }    return desArr;}@end




0 0
原创粉丝点击