这是两种可以上下滚动的控件。

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

这个是UIPickerView,显示类似几个选择项的界面。

注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。

做一个简单界面进行练习。单击生日输入框弹出自定义UIDatePicker,单击城市弹出自定义UIPickerView选择城市。

1、UIDatePicker使用

在点击过文本输入框后弹出日期选中键盘。需要给UITextField控件的inutView属性指定需要显示的界面。

这里显示的代码如下:

- (void)setBirthdayFieldKeyboard

{

//

UIDatePicker *datePicker = [[UIDatePicker alloc] init];

_datePicker = datePicker;

// 只显示时间

datePicker.datePickerMode = UIDatePickerModeDate;

// 显示中文

datePicker.locale = [NSLocalelocaleWithLocaleIdentifier:@"zh"];

// 监听值得改变

[datePicker addTarget:selfaction:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

self.birthdayField.inputView = datePicker;

}

在程序加载时进行设定

- (void)viewDidLoad {

[superviewDidLoad];

[selfsetBirthdayFieldKeyboard];

}

然后对UITextField的一些属性进行设置,比如说不能输入日期,只能选择显示日期。可以在以下代理方法中实现

#pragma mark - textField代理方法

// 是否允许修改填充字符串

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

returnNO;

}

当然使用之前要指定代理并遵守协议。

然后再选择过时间后,同步更新到文本输入框中,这里需要监听控件的valueChanged的方法

[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

响应方法

- (void)datePickerValueChanged:(UIDatePicker *)datePicker

{

NSDateFormatter *formatter = [[NSDateFormatteralloc] init];

// 格式化日期格式

formatter.dateFormat = @"yyyy-MM-dd";

NSString *date = [formatter stringFromDate:datePicker.date];

// 显示时间

self.birthdayField.text = date;

}

最后要设置以下UITextField控件的默认值,默认显示0行0列的值

在改变文本输入框状态时进行设置默认值。

// 是否允许开始编辑(代理方法)

- (void)textFieldDidBeginEditing:(UITextField *)textField

{

// 添加自定义窗口

[selfdatePickerValueChanged:self.datePicker];

}

2、UIPickerView使用

先将城市选择键盘添加到文本输入框

// 设置城市键盘

- (void)setCitiesFieldKeyboard

{

//

UIPickerView *picker = [[UIPickerViewalloc] init];

_cityPicker = picker;

picker.dataSource = self;

picker.delegate = self;

self.cityField.inputView = picker;

}

设置代理和数据源为控制器,实现响应的方法

#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];

}

然后在文本输入框的代理方法中添加默认显示对象

// 是否允许开始编辑

- (void)textFieldDidBeginEditing:(UITextField *)textField

{

if (textField == self.birthdayField)

{

// 添加自定义窗口

[selfdatePickerValueChanged:self.datePicker];

}

else

{

[selfpickerView:self.cityPickerdidSelectRow:0inComponent:0]; // 默认显示0行0列

}

}

效果

主要代码参考

 //
// 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: inComponent:];
}
} #pragma mark - UIPickerView
#pragma mark UIPickerView 数据源
// 列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return ;
}
// 某一列行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == ) // 省会
{
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 == ) // 省会
{
// 获取省会
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 == )
{
// 记录当前省会
_proIndex = [pickerView selectedRowInComponent:];
[pickerView reloadComponent:];
} // 获取选中省会
SLQProvince *pro = self.provinces[_proIndex];
NSInteger cityIndex = [pickerView selectedRowInComponent:];
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里面每行的高度 可以改,不要弄混淆了。

 

IOS笔记045-UIDatePicker和UIPickerView的更多相关文章

  1. 10-UIKit(UIDatePicker、UIPickerView、UIWebView、Storyboard)

    目录: 1. UIDatePicker 2. UIPickerView 3. UIPickerView多列关联 4. UIWebView 5. Storyboard(故事板) 回到顶部 1. UIDa ...

  2. 荼菜的iOS笔记--UIView的几个Block动画

    前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...

  3. iOS基础 - UIDatePicker and UIPickerView and UITextField

    1.UIDatePicker继承自UIControl,因此不会通过代理来监听事件的改变,而是通过addTarget来监听事件.监听的事件是值改变事件. 2.UIPickerView继承自UIView, ...

  4. iOS边练边学--UIPickerView和UIDatePicker的简单使用

    一.点菜系统练习(UIPickerView) <1>UIPickerView的常用代理方法介绍 #pragma mark - <UIPickerViewDelegate> // ...

  5. [ios]新手笔记-。-UIPickerView 关于伪造循环效果和延时滚动效果

    查找了网上资料,循环效果绝大部分都是增加行数来制造循环的错觉,延时滚动就是利用NSTimer间隔出发滚动事件来制造滚动效果. 代码: #import <UIKit/UIKit.h>#imp ...

  6. IOS笔记 1

    < ![CDATA[ 笔记 UIWindows 与UIView的关系iOS的坐标系统视图层次结构视图坐标(Frame和Bounds区别)UIView的常用属性和方法坐标系统的变换UIView内容 ...

  7. 【转】iOS笔记-自定义控件(OC)

    原文网址:http://www.jianshu.com/p/f23862eb7b8a 导读: iOS开发中,很多时候系统提供的控件并不能很好的满足我们的需求,因此,自定义控件便成为搭建UI界面中必不可 ...

  8. iOS开发中UIDatePicker控件的使用方法简介

    iOS上的选择时间日期的控件是这样的,左边是时间和日期混合,右边是单纯的日期模式. 您可以选择自己需要的模式,Time, Date,Date and Time  , Count Down Timer四 ...

  9. iOS笔记———数据存储

    应用沙盒:应用文件系统的根目录,每个应用都有独自的沙盒相互:在xcode中可以用NSHomeDirectory()函数,打印当前应用的沙盒根路径. 应用程序包:包含了所有资源文件和执行文件; * Do ...

随机推荐

  1. struts2是如何加载相关的package元素节点信息的

    这不是一篇纯技术文章,而是一篇分享我个人在前后端分离路上收获的点点滴滴的文章,以此来为准备尝试前后端分离或者想了解前后端分离的童鞋做一个大体的讲解. 上一家公司是家小公司,做了一年的全栈开发,对前端的 ...

  2. Python排列组合问题

    1.字符串的全排列 问题描述:打印出原字符串中所有字符的所有排列.——将输入字符串中的每个字符作为一个不同的字符看待,即使它们是重复的,如'aaa'应打印6次. Python可以用生成器解决: def ...

  3. Java的基本概念

    JAVA的方法签名是 参数类型,参数个数,参数顺序,不包括返回值和访问修饰符. 对象序列化:将一个对象编码成一个字节流.

  4. 一致性Hash算法

    from wikipedia 一致哈希 历史 1997年由MIT的Karger等在一篇学术论文中提出如何将“一致性Hash”应用于用户易变的分布式Web服务中.也可用于实现健壮缓存来减少大型Web应用 ...

  5. <Oracle Database>数据库启动与关闭

    启动和关闭Oracle数据库 要启动和关闭数据库,必须要以具有Oracle 管理员权限的用户登陆,通常也就是以具有SYSDBA权限的用户登陆.一般我们常用INTERNAL用户来启动和关闭数据库(INT ...

  6. thinkphp学习笔记(一)

    一.入门与安装 1.进入C:\Windows\System32\drivers\etc的hosts文件中增加127.0.0.1 www.tp5.com 即访问这个域名就相当于访问127.0.0.1 2 ...

  7. Hyper-V初涉_Hyper-V虚拟机文件交换

    使用虚拟机时,文件交互就显得十分重要.如果能实现物理机与虚拟机之间的文件交互,将会节省大量的时间.比较可惜的是,Hyper-V虚拟机并不支持USB存储设备,所以在文件交换上略显麻烦. 与Hyper-V ...

  8. Android ------ handler 异步处理消息

    Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发 ...

  9. PCA降维

    http://blog.csdn.net/a784763307/article/details/17289317 这篇比较棒 openCV版 void PrintMatrix(CvMat *Matri ...

  10. SSH三大框架笔面试总结

    Java工程师(程序员)面题 Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sess ...