iOS边练边学--UIPickerView和UIDatePicker的简单使用
一、点菜系统练习(UIPickerView)
<1>UIPickerView的常用代理方法介绍
#pragma mark - <UIPickerViewDelegate> // 返回指定列的行宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{ }
// 返回指定列中行的高度
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{ } // 返回第component列的第row行的字符串
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{ }
// 富文本属性,可以描述文字的大小和颜色
- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
{ }
// 返回一个UIView 第component列第row行
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
{ }
// 人为选择第component列第row行之后执行的代码
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{ }
<2>UIPickerView必须实现的两个数据源方法
#pragma mark - <UIPickerViewDataSource> // 告诉pickView有多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return self.foods.count;
} // 告诉pickView的component列中有多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [self.foods[component] count];
}
<3>练习代码
#import "ViewController.h" @interface ViewController () <UIPickerViewDataSource,UIPickerViewDelegate>
@property (weak, nonatomic) IBOutlet UIPickerView *pickView;
/** 数据集合 */
@property(nonatomic,strong) NSArray *foods;
@property (weak, nonatomic) IBOutlet UILabel *fruitLabel;
@property (weak, nonatomic) IBOutlet UILabel *mainLabel;
@property (weak, nonatomic) IBOutlet UILabel *drinkLabel; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
for (int i = ; i < self.foods.count; i++) {
[self pickerView:self.pickView didSelectRow: inComponent:i];
} }
// 随机
- (IBAction)random:(id)sender {
for (int i = ; i <self.foods.count; i++) {
int r = arc4random_uniform((int)[self.foods[i] count]);
[self.pickView selectRow:r inComponent:i animated:YES];
[self pickerView:self.pickView didSelectRow:r inComponent:i];
}
} // 懒加载数据
- (NSArray *)foods
{
if (_foods == nil) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"foods.plist" ofType:nil];
_foods = [NSArray arrayWithContentsOfFile:path];
}
return _foods;
} #pragma mark - <UIPickerViewDataSource> // 告诉pickView有多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return self.foods.count;
} // 告诉pickView的component列中有多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [self.foods[component] count];
} #pragma mark - <UIPickerViewDelegate> // 返回指定列中行的高度
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return ;
} // 返回第component列的第row行的字符串
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return self.foods[component][row];
} // 人为选择第component列第row行之后执行的代码
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
switch (component) {
case :
self.fruitLabel.text = self.foods[component][row];
break;
case :
self.mainLabel.text = self.foods[component][row];
break;
case :
self.drinkLabel.text = self.foods[component][row];
break;
}
} @end
二、国旗选择练习(pickerView每行都是返回一个自定义控件)
//
// ViewController.m
// 0322国旗选择
//
// Created by admin on 16/3/22.
// Copyright © 2016年 admin. All rights reserved.
// #import "ViewController.h"
#import "ChaosFlag.h"
#import "ChaosFlagView.h" @interface ViewController () <UIPickerViewDataSource,UIPickerViewDelegate>
/** 数据模型集合 */
@property(nonatomic,strong) NSMutableArray *flags;
@property (weak, nonatomic) IBOutlet UIPickerView *pickView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
_pickView.delegate = self;
_pickView.dataSource = self;
}
- (NSMutableArray *)flags
{
if (_flags == nil) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];
NSArray *dicArray = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *arr = [NSMutableArray array];
for (NSDictionary *dict in dicArray) {
ChaosFlag *flag = [ChaosFlag flagWithDict:dict];
[arr addObject:flag];
}
_flags = arr;
}
return _flags;
} #pragma mark - <UIPickerViewDataSource>
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return self.flags.count;
} - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return ;
} #pragma mark - 代理方法
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
// 加载xib
ChaosFlagView *flagView = [[NSBundle mainBundle] loadNibNamed:@"ChaosFlagView" owner:nil options:nil][];
ChaosFlag *flag = self.flags[row];
flagView.flag = flag;
return flagView;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return ;
}
@end
三、生日选择,省市二级联动
//
// ViewController.m
// 0323-生日城市选择器
//
// Created by admin on 16/3/23.
// Copyright © 2016年 admin. All rights reserved.
// #import "ViewController.h"
#import "ChaosProvince.h" @interface ViewController () <UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate>
@property (weak, nonatomic) IBOutlet UITextField *birthdayLabel;
@property (weak, nonatomic) IBOutlet UITextField *cityLabel; /** 数据集合 */
@property(nonatomic,strong) NSMutableArray *provinces; /** datePicker */
@property(nonatomic,strong) UIDatePicker *datePicker;
/** pickView */
@property(nonatomic,strong) UIPickerView *pickView;
/** 选中的省会索引,用来保存上一次选择的省索引,防止同时拖拽省和市时报错 */
@property(nonatomic,assign) NSInteger proIndex;
@end @implementation ViewController // 重写get方法,实现懒加载
- (NSMutableArray *)provinces
{
if (_provinces == nil) {
// 初始化数据模型,必须要实例化对象!国旗选择的练习中没有实例化,数据出不来,找了老半天!
_provinces = [NSMutableArray array];
NSString *path = [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil];
NSArray *dicArray = [NSArray arrayWithContentsOfFile:path];
for (NSDictionary *dict in dicArray) {
ChaosProvince *province = [ChaosProvince provinceWithDict:dict];
[_provinces addObject:province];
}
}
return _provinces;
} - (void)viewDidLoad {
[super viewDidLoad]; _cityLabel.delegate = self; _birthdayLabel.delegate = self;
[self setBirthdayInputView];
[self setCitiesInputView];
}
/** 给文本框设置时间选择器的方法 */
- (void)setBirthdayInputView
{
// 给生日文本框设置datePicker
_datePicker = [[UIDatePicker alloc] init];
// 设置时间选择器的语言 zh--中国
_datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
// 设置时间选择器显示的时间格式
_datePicker.datePickerMode = UIDatePickerModeDate;
_birthdayLabel.inputView = _datePicker;
// 想要监听一个控件,没有delegate,就找addTarget方法(这个的前提是控件继承自UIControl)
[_datePicker addTarget:self action:@selector(dateChange:) forControlEvents:UIControlEventValueChanged];
}
/** 监听时间选择器改变的方法 */
- (void)dateChange:(UIDatePicker *)datePicker
{
// 取出时间
NSDate *date = datePicker.date;
// NSDate与NSString之间的转换
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat =@"yyyy-MM-dd";
NSString *time = [formatter stringFromDate:date];
_birthdayLabel.text = time;
} /** 给城市文本框设置选择器的方法 */
- (void)setCitiesInputView
{
_pickView = [[UIPickerView alloc] init];
_pickView.delegate = self;
_pickView.dataSource = self;
_cityLabel.inputView = _pickView;
} #pragma mark - pickView数据源方法
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == ) { // 省的个数
return self.provinces.count;
} else { // 省对应的城市
ChaosProvince *province = self.provinces[self.proIndex];
return province.cities.count;
}
} - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return ; // 两列
} #pragma mark - pickerView代理方法
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == ) { // 省
ChaosProvince *province = self.provinces[row];
return province.name;
}
else // 城市
{
// 根据省的索引获取对应的城市
ChaosProvince *province = self.provinces[self.proIndex];
return province.cities[row];
}
} // 滚动pickerView就调用
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (component == ) { // 选择省,刷新相应的城市
[pickerView reloadComponent:];
// 记录当前选中的省会索引
self.proIndex = [pickerView selectedRowInComponent:];
}
// 显示到文本框中 // 选中的省
ChaosProvince *province = self.provinces[self.proIndex]; // 选中的城市
NSInteger cityIndex = [pickerView selectedRowInComponent:];
self.cityLabel.text = [NSString stringWithFormat:@"%@ %@",province.name,province.cities[cityIndex]]; } #pragma mark - <UITextFieldDelegate>
// 文本框开始编辑的时候执行的方法
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
if (textField == self.birthdayLabel) { //生日文本 [self dateChange:_datePicker];
} else if (textField == self.cityLabel) { // 城市文本
[self pickerView:self.pickView didSelectRow: inComponent:];
}
} // 是否允许在范围内改变字符
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
return NO;
}
@end
iOS边练边学--UIPickerView和UIDatePicker的简单使用的更多相关文章
- iOS边练边学--Http网络再学习,简单介绍
一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...
- iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信
一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...
- iOS边练边学--CALayer,非根层隐式动画,钟表练习
一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...
- iOS边练边学--UIGestureRecognizer手势识别器简单介绍
iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...
- iOS边练边学--触摸事件以及能够拖拽的UIView的练习
一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象 ...
- iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种
iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...
- iOS边练边学--图片的拉伸
图片拉伸方法一: IOS 5.0以后才有的方法: - (void)viewDidLoad { [super viewDidLoad]; UIImageView *imageView = [[UIIma ...
- iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传
实现重点: NSURLSessionDataTask要设置请求头,从路径中获取文件已经下载的长度(文件没有下载过的话,长度为0).通过这个长度设置请求的Range 如图: 接收到请求的时候key:文件 ...
- iOS边练边学--AFNetWorking框架GET、Post、Download、Upload,数据解析模式以及监控联网状态
一.AFNETWorking简单使用 get请求 get请求,以后经常用NSURLSession底层的写的部分 简单的post请求 用post请求下载文件,方法很多,还可以通过upload任务来执行 ...
随机推荐
- 开发完 iOS 应用,接下去你该做的事
iOS专项总结 一个应用经过多次迭代后告一段落,接下去我们在技术上还可以做些什么呢?答案是提高代码的整体质量.关于这方面,除了我们常喊的 重构,测试也非常重要. 博主近期给我们的 iOS客户端代码来了 ...
- iOS开发之多媒体播放
iOS开发之多媒体播放 iOS sdk中提供了很多方便的方法来播放多媒体.本文将利用这些SDK做一个demo,来讲述一下如何使用它们来播放音频文件. AudioToolbox framework 使用 ...
- jsp里面实现asp.net的Global文件内容。
Global.java文件: import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import ...
- Debian/Ubuntu架设nginx+bugzilla
题注 最近需要一个简单快速的bug追踪工具,考虑到系统环境以及学习成本,决定采用bugzilla.不试不知道,原来这里面还有这么多的坑需要一个个踩平~,遂随笔一下以备后用. 我采用的系统组成是debi ...
- Ubuntu 10.04 安装Qt4.8.1 源码后字体模糊的问题
Ubuntu 10.04 安装QT4.8.1 源码后字体模糊的问题. 附加解决 QT SDK 4.8.1 链接失败的问题 Ubuntu 10.04 编译QT源码后,编译程序,运行后IPA字体无法正常显 ...
- mySQL把秒转换成日期
mysql> SELECT SEC_TO_TIME (3600); +--------------------+ | SEC_TO_TIME (3600) | +---------------- ...
- bzoj 1860: [Zjoi2006]Mahjong麻将 题解
[原题] 1860: [Zjoi2006]Mahjong麻将 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 211 Solved: 122 [Subm ...
- Spring cloud子项目
目前来说spring主要集中于spring boot(用于开发微服务)和spring cloud相关框架的开发,我们从几张图着手理解,然后再具体介绍: spring cloud子项目包括: Sprin ...
- [sh]uniq-sort-awk
题目:[百度搜狐面试题] 统计url出现次数 oldboy.log http://www.etiantain.org/index.html http://www.etiantain.org/1.htm ...
- Spring-两种配置容器
Spring提供了两种容器类型 SpringIOC容器是一个IOC Service Provider.提供了两种容器类型:BeanFactory和ApplicationContext.Sp ...