一、点菜系统练习(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的简单使用的更多相关文章

  1. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

  2. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

  3. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  4. iOS边练边学--UIGestureRecognizer手势识别器简单介绍

    iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...

  5. iOS边练边学--触摸事件以及能够拖拽的UIView的练习

    一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象 ...

  6. iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

    iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...

  7. iOS边练边学--图片的拉伸

    图片拉伸方法一: IOS 5.0以后才有的方法: - (void)viewDidLoad { [super viewDidLoad]; UIImageView *imageView = [[UIIma ...

  8. iOS边练边学--NSURLSessionDataTask实现文件真正的断点续传

    实现重点: NSURLSessionDataTask要设置请求头,从路径中获取文件已经下载的长度(文件没有下载过的话,长度为0).通过这个长度设置请求的Range 如图: 接收到请求的时候key:文件 ...

  9. iOS边练边学--AFNetWorking框架GET、Post、Download、Upload,数据解析模式以及监控联网状态

    一.AFNETWorking简单使用 get请求 get请求,以后经常用NSURLSession底层的写的部分 简单的post请求 用post请求下载文件,方法很多,还可以通过upload任务来执行 ...

随机推荐

  1. Extending_and_embedding_php翻译

    http://blog.csdn.net/lgg201 博客翻译了Extending_and_embedding_php

  2. epoll 系列函数简介、与select、poll 的区别

    一.epoll 系列函数简介 #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags) ...

  3. Python 字典 pop() 方法

    描述 Python 字典 pop() 方法删除给定键所对应的键/值对,并返回被删除的值.给定键如果不在字典中,则必须设置一个default值,否则会报错,此时返回的就是default值. 语法 pop ...

  4. Python splitlines()方法

    描述 Python splitlines() 按照行界符('\r', '\r\n', \n'等)分隔,返回一个包含各行作为元素的列表,默认不包含行界符. 能被识别的行界符: 行界符 描述 \n Lin ...

  5. django中models阅读笔记

    一.使用数据库需要设置settings.py文件. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgre ...

  6. Google大牛分享的面试秘籍

    我憋了很长时间想写点关于去Google面试的秘籍.不过我总是推迟,因为写出来的东西会让你抓狂.很可能是这样.如果按统计规律来定义“你”的话,这文章很可能让你不爽. 为啥呢?因为啊……好吧,对此我写首小 ...

  7. 关于Xilinx MicroBlaze应用modelsim se仿真问题(EDK:3593 - Unable to locate the precompiled library microblaze_v8_50_c)

    ERROR:EDK:3593 - Unable to locate the precompiled library microblaze_v8_50_c. The file D:\Xilinx\14. ...

  8. JVM 发生OOM的四种情况

    1.Java堆溢出:heap Java堆内存主要用来存放运行过程中所以的对象,该区域OOM异常一般会有如下错误信息;java.lang.OutofMemoryError:Javaheap space此 ...

  9. MSVC與CRT的恩怨情仇

    很久沒有寫程式設計入門知識的相關文章了,這篇文章要來談談程式庫 (Library) 連結,以及關於 MSVC 與 CRT 之間的種種恩怨情仇. 如果你使用的作業系統是 Linux.Mac 或其他非 W ...

  10. mac os开发之简单动画

    [NSAnimationContextbeginGrouping]; [[NSAnimationContextcurrentContext] setDuration:.1f]; [[self.wind ...