UIPickerView組件類似HTML都Select組件效果,提供數據供用戶選擇。可以通過plist文件提供數據。UIPickerView是一個選擇器控件,可以生成單列的選擇器,也可以生成多列的選擇器,而且開發者完全可以自定義選擇項的外觀,用法十分靈活。UIPickerView直接繼承了UIView,沒有繼承UIControl,因此,它不能像UIControl那樣綁定事件處理方法,UIPickerView的事件處理由其委托對象完成。
例子一——單列選擇器
//
// ViewController.m
// UIPickerViewDemo
//
// Created by Apple on 16/5/17.
// Copyright © 2016年 Apple. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
NSArray* timors;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 創建、並初始化NSArray對象。
timors = [NSArray arrayWithObjects:@"提莫1",
@"提莫2", @"提莫3" , @"提莫4",@"提莫5",nil];
UIPickerView* pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
// 為UIPickerView控件設置dataSource和delegate
[pickerView setDataSource:self];
[pickerView setDelegate:self];
// 設置默認選中的值
// selectRow 表示下拉列表的默認值(從0開始)
// inComponent 表示第幾個下拉列表對象 (從0開始)
// 注意:數據初始化要在下面的代碼之前完成 否則數據顯示不了
[pickerView selectRow:1 inComponent:0 animated:YES];
[self.view addSubview:pickerView];
}
#pragma mark -UIPickerViewDataSource
// UIPickerViewDataSource中定義的方法,設置出現幾個下拉列表 (返回2 表示出現2個下拉列表)
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView
{
return 1;
}
// UIPickerViewDataSource中定義的方法,該方法返回值決定該控件指定列包含多少個列表項
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
// 由於該控件只包含一列,因此無需理會列序號參數component
// 該方法返回timors.count,表明books包含多少個元素,該控件就包含多少行
return timors.count;
}
// 當用戶選中UIPickerViewDataSource中指定列、指定列表項時激發該方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:
(NSInteger)row inComponent:(NSInteger)component
{
// 使用一個UIAlertView來顯示用戶選中的列表項
UIAlertView* alert = [[UIAlertView alloc]
initWithTitle:@"提示"
message:[NSString stringWithFormat:@"你選中的提莫是:%@"
, [timors objectAtIndex:row]]
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
}
#pragma mark -UIPickerViewDelegate
// UIPickerViewDelegate中定義的方法,該方法返回的NSString將作為UIPickerView
// 中指定列、指定列表項的標題文本
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// 由於該控件只包含一列,因此無需理會列序號參數component
// 該方法根據row參數來返回timors中的元素,row參數代表列表項的編號,
// 因此該方法表示第幾個列表項,就使用timors中的第幾個元素
return [timors objectAtIndex:row];
}
@end


例子二——多列選擇器
//
// ViewController.m
// MultPickerViewDemo
//
// Created by Apple on 16/5/17.
// Copyright © 2016年 Apple. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
NSArray* heroes;
NSArray* timors;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 創建、並初始化2個NSArray對象,分別作為2列的數據
heroes = [NSArray arrayWithObjects:@"李青", @"提莫" , nil];
timors = [NSArray arrayWithObjects: @"提莫1",
@"提莫2", @"提莫3" , @"提莫4",@"提莫5", nil];
UIPickerView* pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
// 為UIPickerView控件設置dataSource和delegate
[pickerView setDataSource:self];
[pickerView setDelegate:self];
[self.view addSubview:pickerView];
}
#pragma mark -UIPickerViewDataSource
// UIPickerViewDataSource中定義的方法,設置出現幾個下拉列表 (返回2 表示出現2個下拉列表)
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView
{
return 2;
}
// UIPickerViewDataSource中定義的方法 設置下拉列表的數量
// 參數1:操作的UIPickerView對象
// 參數2:操作的UIPickerView對象的下拉列表的下標(從0開始)
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
// 如果是第一列,返回authors中元素的個數
// 即authors包含多少個元素,第一列就包含多少個列表項
if (component == 0) {
return heroes.count;
}
// 如果是其他列,返回books中元素的個數。
// 即books包含多少個元素,其他列(只有第二列)包含多少個列表項
return timors.count;
}
// 當用戶選中UIPickerViewDataSource中指定列、指定列表項時激發該方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:
(NSInteger)row inComponent:(NSInteger)component
{
NSArray* tmp = component == 0 ? heroes: timors;
NSString* tip = component == 0 ? @"英雄": @"提莫";
// 使用一個UIAlertView來顯示用戶選中的列表項
UIAlertView* alert = [[UIAlertView alloc]
initWithTitle:@"提示"
message:[NSString stringWithFormat:@"你選中的%@是:%@,"
, tip , [tmp objectAtIndex:row]]
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
}
#pragma mark -UIPickerViewDelegate
// UIPickerViewDelegate中定義的方法 設置下拉列表的數據
// 參數1:操作的UIPickerView對象
// 參數2:下拉列表項下標(從0開始)[下拉列表的第幾項]
// 參數3:操作的UIPickerView對象的下拉列表的下標[第幾個下拉列表](從0開始)
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// 如果是第一列,返回heroes中row索引處的元素
// 即第一列的列表項標題由heroes集合元素決定。
if (component == 0) {
return [heroes objectAtIndex:row];
}else{
// 如果是其他列(只有第二列),返回timors中row索引處的元素
// 即第二列的列表項標題由books集合元素決定。
return [timors objectAtIndex:row];
}
}
// UIPickerViewDelegate中定義的方法,該方法返回的NSString將作為
// UIPickerView中指定列的寬度
- (CGFloat)pickerView:(UIPickerView *)pickerView
widthForComponent:(NSInteger)component
{
// 如果是第一列,寬度為90
if (component == 0) {
return 90;
}
// 如果是其他列(只有第二列),寬度為210
return 210;
}
@end



例子3-相互依賴的多列選擇器
//
// ViewController.m
// MultPickerView2Demo
//
// Created by Apple on 16/5/17.
// Copyright © 2016年 Apple. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
NSArray* heroes;
NSDictionary* skins;
// selectedHero保存當前選中的英雄
NSString* selectedHero;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 創建、並初始化NSDictionary對象。
skins = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObjects:@"李青1" , @"李青2", nil]
, @"李青",
[NSArray arrayWithObjects:@"提莫1",@"提莫2", nil] , @"提莫",
[NSArray arrayWithObjects:@"瑞文1",
@"瑞文2", @"瑞文3" , nil]
, @"瑞文" ,nil];
// 使用heroes保存skins所有key組成的NSArray排序後的結果
heroes = [skins allKeys];
// 設置默認選中的作者heroes中第一個元素
selectedHero = [heroes objectAtIndex:0];
UIPickerView* pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
// 為UIPickerView控件設置dataSource和delegate
[pickerView setDataSource:self];
[pickerView setDelegate:self];
[self.view addSubview:pickerView];
}
#pragma mark -UIPickerViewDataSource
// UIPickerViewDataSource中定義的方法,設置出現幾個下拉列表 (返回2 表示出現2個下拉列表)
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView
{
return 2;
}
// UIPickerViewDataSource中定義的方法 設置下拉列表的數量
// 參數1:操作的UIPickerView對象
// 參數2:操作的UIPickerView對象的下拉列表的下標(從0開始)
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
// 如果是第一列,返回heroes中元素的個數
// 即heroes包含多少個元素,第一列就包含多少個列表項
if (component == 0) {
return heroes.count;
}
// 如果是其他列(只有第二列),
// 返回skins中selectedHero對應的NSArray中元素的個數。
return [[skins objectForKey:selectedHero] count];
}
// 當用戶選中UIPickerViewDataSource中指定列、指定列表項時激發該方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:
(NSInteger)row inComponent:(NSInteger)component
{
if(component == 0)
{
// 改變被選中的英雄
selectedHero = [heroes objectAtIndex:row];
// 重點在這, 選中上層時, 相應的下層的數據會變動, 此時需要reloadComponent
// 控制重寫加載第二個列表,根據選中的作者來加載第二個列表
[pickerView reloadComponent:1];
}
NSArray* tmp = component == 0 ? heroes:
[skins objectForKey:selectedHero];
NSString* tip = component == 0 ? @"英雄": @"皮膚";
// 使用一個UIAlertView來顯示用戶選中的列表項
UIAlertView* alert = [[UIAlertView alloc]
initWithTitle:@"提示"
message:[NSString stringWithFormat:@"你選中的%@是:%@,"
, tip , [tmp objectAtIndex:row]]
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
}
#pragma mark -UIPickerViewDelegate
// UIPickerViewDelegate中定義的方法 設置下拉列表的數據
// 參數1:操作的UIPickerView對象
// 參數2:下拉列表項下標(從0開始)[下拉列表的第幾項]
// 參數3:操作的UIPickerView對象的下拉列表的下標[第幾個下拉列表](從0開始)
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// 如果是第一列,返回heroes中row索引處的元素
// 即第一列的元素由heroes集合元素決定。
if (component == 0) {
return [heroes objectAtIndex:row];
}
// 如果是其他列(只有第二列),
// 返回skins中selectedHero對應的NSArray中row索引處的元素
return [[skins objectForKey:selectedHero] objectAtIndex:row];
}
// UIPickerViewDelegate中定義的方法,該方法返回的NSString將作為
// UIPickerView中指定列的寬度
- (CGFloat)pickerView:(UIPickerView *)pickerView
widthForComponent:(NSInteger)component
{
// 如果是第一列,寬度為90
if (component == 0) {
return 90;
}
// 如果是其他列(只有第二列),寬度為210
return 210;
}
@end



