IOS笔记045-UIDatePicker和UIPickerView

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

这是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列

}

}

效果

主要代码参考

  1 //
  2 //  ViewController.m
  3 //  KVC实现原理
  4 //
  5 //  Created by Christian on 15/6/9.
  6 //  Copyright (c) 2015年 slq. All rights reserved.
  7 //
  8
  9 #import "ViewController.h"
 10 #import "SLQProvince.h"
 11 @interface ViewController () <UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate>
 12
 13 @property (nonatomic,weak) UIDatePicker *datePicker;
 14 @property (nonatomic, weak) UIPickerView *cityPicker;
 15 @property (nonatomic, strong) NSMutableArray *provinces;
 16
 17 @property (nonatomic, assign) NSInteger proIndex;
 18
 19 @end
 20
 21 @implementation ViewController
 22
 23
 24 // 懒加载省会
 25 - (NSMutableArray *)provinces
 26 {
 27     if (_provinces == nil) {
 28         // 装所有的省会
 29         _provinces = [NSMutableArray array];
 30
 31         // 加载plist文件
 32         NSString *filePath = [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil];
 33         NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
 34
 35         for (NSDictionary *dict in arr) {
 36             // 字典转模型
 37             SLQProvince *p = [SLQProvince provinceWithDict:dict];
 38
 39             [_provinces addObject:p];
 40         }
 41     }
 42     return _provinces;
 43 }
 44
 45 - (void)viewDidLoad {
 46     [super viewDidLoad];
 47
 48     //
 49     self.birthdayField.delegate = self;
 50     self.cityField.delegate = self;
 51     //
 52     [self setBirthdayFieldKeyboard];
 53     [self setCitiesFieldKeyboard];
 54
 55 }
 56
 57 #pragma mark - textField代理方法
 58 // 是否允许修改填充字符串
 59 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 60 {
 61     return NO;
 62 }
 63 // 是否允许开始编辑
 64 - (void)textFieldDidBeginEditing:(UITextField *)textField
 65 {
 66     if (textField == self.birthdayField)
 67     {
 68         // 添加自定义窗口
 69         [self datePickerValueChanged:self.datePicker];
 70     }
 71     else
 72     {
 73         [self pickerView:self.cityPicker didSelectRow:0 inComponent:0];
 74     }
 75 }
 76
 77 #pragma mark - UIPickerView
 78 #pragma mark UIPickerView 数据源
 79 // 列数
 80 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
 81 {
 82     return 2;
 83 }
 84 // 某一列行数
 85 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
 86 {
 87     if (component == 0)  // 省会
 88     {
 89         return self.provinces.count;
 90     }
 91     else  // 其他城市
 92     {
 93         SLQProvince *pro = self.provinces[_proIndex];
 94         return pro.cities.count;
 95     }
 96 }
 97
 98 #pragma mark UIPickerView 代理
 99 // 每行的标题
100 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
101 {
102     if (component == 0)  // 省会
103     {
104         // 获取省会
105         SLQProvince *pro = self.provinces[row];
106         return pro.name;
107     }
108     else  // 其他城市
109     {
110
111         SLQProvince *pro = self.provinces[_proIndex];
112         return pro.cities[row];
113     }
114 }
115 // 是否选中某行
116 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
117 {
118     // 滚动省会刷新城市
119     if(component == 0)
120     {
121         // 记录当前省会
122         _proIndex = [pickerView selectedRowInComponent:0];
123         [pickerView reloadComponent:1];
124     }
125
126     // 获取选中省会
127     SLQProvince *pro = self.provinces[_proIndex];
128     NSInteger cityIndex = [pickerView selectedRowInComponent:1];
129     NSString *cityName = pro.cities[cityIndex];
130     _cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName];
131 }
132
133
134 #pragma mark - 自定义方法
135 // 设置城市键盘
136 - (void)setCitiesFieldKeyboard
137 {
138     //
139     UIPickerView *picker = [[UIPickerView alloc] init];
140     _cityPicker = picker;
141     picker.dataSource = self;
142     picker.delegate = self;
143     self.cityField.inputView = picker;
144 }
145
146 // 设置生日键盘
147 - (void)setBirthdayFieldKeyboard
148 {
149     //
150     UIDatePicker *datePicker = [[UIDatePicker alloc] init];
151     _datePicker = datePicker;
152     // 只显示时间
153     datePicker.datePickerMode = UIDatePickerModeDate;
154     // 显示中文
155     datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
156     // 监听值得改变
157     [datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
158     self.birthdayField.inputView = datePicker;
159 }
160
161 - (void)datePickerValueChanged:(UIDatePicker *)datePicker
162 {
163     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
164     // 格式化日期格式
165     formatter.dateFormat = @"yyyy-MM-dd";
166     NSString *date = [formatter stringFromDate:datePicker.date];
167     // 显示时间
168     self.birthdayField.text = date;
169 }
170 @end

代码参考

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

时间: 2024-10-11 04:16:48

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

iOS开发 点菜系统 使用UIPickerView

利用UIPickerView实现一个简单的点菜界面,如下图所示.源码地址:https://github.com/xiaoLong1010/iOSAppDemo.git UIPickerView有两个协议UIPickerViewDataSource,UIPickerViewDelegate,它们为UIPickeView提供数据和代理.UIPickeView的三个component分别代表fruit,main,drink,选中某一行,菜名在下面显示.最上面的随机按钮,则实现随机点菜功能. 1.vie

iOS.UIKit.10.UIDatePicker

一.案例介绍:点击屏幕中的UIButton,将在UIDatePicker选择的日期显示在UILabel中,如图01,02 图01图02 二.案例步骤: 1.选择Simple View Aplication,取名cq.36.日期选择器,如图03 图03 2.Main.storyboard,如图04 3.CQ36ViewController.h #import <UIKit/UIKit.h> @interface CQ36ViewController : UIViewController @pro

iOS笔记:Objective-C自定义NSLog宏

/*  XCode LLVM XXX - Preprocessing中Debug会添加 DEBUG=1 标志  */ #ifdef DEBUG #define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORM

学习ios笔记第一天的C语言学习记录

c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 = num2; //先把temp放到num2里 num2 = temp; 算数运算符 +加法运算 -减法运算符 *乘法运算符 /除法运算符  ------整型相除取整,除数不为0 %取余运算符 ------两边均为整数 ++递增运算-------运算符在前,先执行:运算符在后,后执行: --递减运

iOS 笔记-incompatible pointer types initializing &#39;NSMutableString *&#39; with an expression of type &#39;NSString *&#39;警告处理

记录下来,以防止再犯错 代码如下 NSString *userHeader = [userInfoDictionary objectForKey:@"photo"]; NSMutableString *mutableuserHeader = [NSMutableString stringWithString:userHeader]; //设置用户头像 NSRange range = [mutableuserHeader rangeOfString:@".."]; [

IOS控件 UIDatePicker

效果 初始化 UIDatePicker *pick = [[UIDatePicker alloc] init]; 属性 1. 模式 pick.datePickerMode = UIDatePickerModeTime; 可写属性有 UIDatePickerModeTime, // Displays hour, minute, and optionally AM/PM designation depending on the locale setting (e.g. 6 | 53 | PM) UI

IOS开发-UIDatePicker和UIPickerView(拾取器)

外观及作用                     UIDatePicker和事件相关,用来设置时间,选择时间等.UIPickerView则是自定义的,可以用作下拉列表等 运行结果 本示例主要简示了这些拾取器的用法,效果图如下所示(改成Iphone4大小了):          构建概要 1.新建基本视图或者基于TabView的工程,如果是基本的工程,需要额外操作转换为TabView,方法为:打开Main.storyboard,选中视图,然后在Xcode的菜单中Edit->Ebeded in->

麦子学院ios笔记:IOS把图片缓存到本地的几种方法

把ios的图片缓存到本地的方法有几种?现在来看看学生在麦子学院学习ios开发的笔记中有讲到哪几种方法呢? <code>把图片缓存到本地,在很多场景都会用到,如果是只储存文字信息,那建一个plist文件,或者数据库就能很方便的解决问题,但是如果存图片到沙盒就没那么方便了.这里介绍两种保存图片到沙盒的方法. </code> 一.把图片转为base64的字符串存到数据库中或者plist文件中,然后用到的时候再取出来 <code class="hljs" obje

[iOS笔记]《编写高质量iOS与OS X代码的52个有效方法》:1.熟悉Objective-C

简介: 最近公司项目收尾,可以有时间看看书了.<编写高质量iOS与OS X代码的52个有效方法>这本书讲解了很多iOS开发的技巧和规范,大力推荐! 下面是自己看书时整理的笔记,照惯例先上目录: 目录: 第一章:熟悉Objective-C 第二章:Object.Message.Runtime 第三章:接口与API设计 第四章:Protocol与Category 第五章:内存管理 第六章:Block与GCD 第七章:系统框架 第一章    熟悉Objective-C 第1条:了解Objective