iOS开发之基础视图—— UIPickerView

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

效果图如下:

时间: 2024-10-05 20:32:43

iOS开发之基础视图—— UIPickerView的相关文章

iOS开发之基础视图——UIButton

按钮是最普通的UI控件,它继承了UIControl基类,默认属于活动控件,它可以与用户交互,并激发相应的事件处理方法. 下面范例是几种常用的按钮设置方法: // // ViewController.m // UIButtonDemo // // Created by Apple on 16/5/10. // Copyright © 2016年 Apple. All rights reserved. // #import "ViewController.h" @interface Vie

iOS开发之基础视图——UITextView

多行文本控件(UITextView)继承了UIScrollView:UIView控件,因此它默认带有滚动条. UITextField  和  UITextView 的区别 UITextField 能输入 单 行数据 UITextView 能输入 多 行数据 UITextView没有继承父类,绑定事件操作不方便 UITextView 继承了UIScrollView ,支持垂直和水平的滚动条 // // ViewController.m // UITextViewDemo // // Created

iOS开发UI基础—IOS开发中Xcode的一些使用技巧

iOS开发UI基础-IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文件 视图 option + cmd + 回车 打开助理编辑器 cmd + 回车           显示主窗口 cmd + 0             导航窗口 option + cmd + 0    工具窗口 在.m & .h之间切换           control + cmd + 上/下

IOS开发UI基础—在UIImageView中添加按钮以及Tag的参数说明

ios开发UI基础-在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwithtag: 提示点:在xib中如果想要通过tag参数获取对应的控件(属性),不要把tag的参数设置为0,因为xib中所有的对象默认tag都为0,设置为0取不到对象. 二.ImageView中添加按钮(1)ImageView和Button的比较 Button按钮的内部可以放置多张图片(4),而Im

iOS开发UI基础—xib的简单使用

iOS开发UI基础-xib的简单使用 一.简单介绍 xib和stotyboard的比较,一个轻量级一个重量级. 二.xib的简单使用 1.建立xib文件 建立的xib文件命名为appxib.xib 2.对xib进行设置 根据程序的需要,这里把view调整为自由布局 建立view模型(设置长宽等参数) 调整布局和内部的控件 完成后的单个view 3.使用xib文件的代码示例 YYViewController.m文件代码如下: 1 // 2 // YYViewController.m 3 // 10

iOS开发UI基础—简单的浏览器查看程序

iOS开发UI基础-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 1 // 2 // YYViewController.m 3 // 03-图片浏览器初步 4 // 5 // Created by apple on 14-5-21. 6 // Copyright (c) 2014年 itcas

iOS开发UI基础—transframe属性(形变)

iOS开发UI基础-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建"基于控件初始位置"的形变 CGAffineTransformMakeTranslation(平移) CGAffineTransformMakeScale(缩放) CGAffineTransformMakeRotation(旋转) (2) 创建"基于trans

IOS 开发笔记-基础 UI(1)-简单的计算器

(1)UI是App的根基:一个App应该是先有UI界面,然后在UI的基础上增加实用功能 (2)UI相对简单易学:UI普遍是学习过程中最简单的一块,能快速拥有成就感和学习兴趣 (3)UI至关重要:开发中的绝大部分时间都在处理UI 谨记一条IOS软件开发定律:万物皆对象,UI界面上的每一个元素都是一个对象 IOS,android 软件开发过程 UIKit框架是跟UI有关系的,标签,文本,按钮,进度条,开关等控件,都是封装在UIKit框架内部的,UIKit框架中提供了丰富多彩的可视化组件元素,利用UI

iOS开发UI基础—从代码的逐步优化看MVC

iOS开发UI基础-从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by