您的位置:首页 > 产品设计 > UI/UE

IOS笔记045-UIDatePicker和UIPickerView

2015-06-10 00:18 471 查看
这是两种可以上下滚动的控件。

这是UIDatePicker,可以显示日期和时间。

//
//  ViewController.m
//  KVC实现原理
//
//  Created by Christian on 15/6/9.
//  Copyright (c) 2015年 slq. All rights reserved.
//

#import "ViewController.h"
#import "SLQProvince.h"
@interface ViewController () <UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate>

@property (nonatomic,weak) UIDatePicker *datePicker;
@property (nonatomic, weak) UIPickerView *cityPicker;
@property (nonatomic, strong) NSMutableArray *provinces;

@property (nonatomic, assign) NSInteger proIndex;

@end

@implementation ViewController

// 懒加载省会
- (NSMutableArray *)provinces
{
if (_provinces == nil) {
// 装所有的省会
_provinces = [NSMutableArray array];

// 加载plist文件
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil];
NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];

for (NSDictionary *dict in arr) {
// 字典转模型
SLQProvince *p = [SLQProvince provinceWithDict:dict];

[_provinces addObject:p];
}
}
return _provinces;
}

- (void)viewDidLoad {
[super viewDidLoad];

//
self.birthdayField.delegate = self;
self.cityField.delegate = self;
//
[self setBirthdayFieldKeyboard];
[self setCitiesFieldKeyboard];

}

#pragma mark - textField代理方法
// 是否允许修改填充字符串
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
return NO;
}
// 是否允许开始编辑
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
if (textField == self.birthdayField)
{
// 添加自定义窗口
[self datePickerValueChanged:self.datePicker];
}
else
{
[self pickerView:self.cityPicker didSelectRow:0 inComponent:0];
}
}

#pragma mark - UIPickerView
#pragma mark UIPickerView 数据源
// 列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
// 某一列行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0)  // 省会
{
return self.provinces.count;
}
else  // 其他城市
{
SLQProvince *pro = self.provinces[_proIndex];
return pro.cities.count;
}
}

#pragma mark UIPickerView 代理
// 每行的标题
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0)  // 省会
{
// 获取省会
SLQProvince *pro = self.provinces[row];
return pro.name;
}
else  // 其他城市
{

SLQProvince *pro = self.provinces[_proIndex];
return pro.cities[row];
}
}
// 是否选中某行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
// 滚动省会刷新城市
if(component == 0)
{
// 记录当前省会
_proIndex = [pickerView selectedRowInComponent:0];
[pickerView reloadComponent:1];
}

// 获取选中省会
SLQProvince *pro = self.provinces[_proIndex];
NSInteger cityIndex = [pickerView selectedRowInComponent:1];
NSString *cityName = pro.cities[cityIndex];
_cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName];
}

#pragma mark - 自定义方法
// 设置城市键盘
- (void)setCitiesFieldKeyboard
{
//
UIPickerView *picker = [[UIPickerView alloc] init];
_cityPicker = picker;
picker.dataSource = self;
picker.delegate = self;
self.cityField.inputView = picker;
}

// 设置生日键盘
- (void)setBirthdayFieldKeyboard
{
//
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
_datePicker = datePicker;
// 只显示时间
datePicker.datePickerMode = UIDatePickerModeDate;
// 显示中文
datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
// 监听值得改变
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
self.birthdayField.inputView = datePicker;
}

- (void)datePickerValueChanged:(UIDatePicker *)datePicker
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 格式化日期格式
formatter.dateFormat = @"yyyy-MM-dd";
NSString *date = [formatter stringFromDate:datePicker.date];
// 显示时间
self.birthdayField.text = date;
}
@end


代码参考

注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: