选择器(UIPickerView)

Apple提供了两种形式的选择器:日期选择器(UIDatePicker)与自定义选择器(UIPickerView)。

当用户使用日期选择器选定一个时间后,调用datePickerID.date可以直接获得一个NSDate对象,从而可以进行一系列的时间与日期处理。

自定义选择器的使用稍微麻烦点,当你直接从控件栏里拖放Picker View到故事板然后运行,会发现调试器界面空无一物。这是因为UIPickerView必须用代码实现一些协议才能正常显示。而且无法在Attributes Inspector中配置选择器视图的外观。

自定义选择器需要遵守两个协议:数据源协议和委托协议。

1. 数据源协议

数据源协议(UIPickerViewDataSource)用来描述选择器显示多少信息。有下面两个主要方法:
numberOfComponentInPickerView -- 返回选择器的组件数
pickerView:numberOfRowsInComponent -- 返回指定组件包含多少行(不同的输入值)

例如,如果要创建一个选择器,显示两列,其中第一列包含一个可供选择的值,而第二列包含两个,则代码实现如下:

 @interface ViewController : UIViewController <UIPickerViewDataSource>

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2; //显示两列
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if(component==0)
    {
        //如果是第一列,显示1个标签
        return 1;
    }
    else
    {
        //否则显示2个标签
        return 2;
    }
}

2. 委托协议

委托协议(UIPickerViewDelegate)负责创建和使用选择器的系列工作。它负责将合适的数据传递给选择器进行显示,并确定用户是否做出了选择。该协议包含多个方法,但只有两个是必不可少的:
pickerView:titleForRow:forComponent -- 根据指定的组件和行号返回该行的标题,即应向用户显示的字符串
pickerView:didSelectRow:inComponent -- 当用户在选择器中做出选择时,将调用该委托方法,并向它传递用户选择的行号以及用户最后触摸的组件

UIPickView还有一个实例方法- (NSInteger)selectedRowInComponent:(NSInteger)component,用来返回指定列当前选择的行数。通常和pickerView:didSelectRow:inComponent配合使用。想象这样的情况:选择器有两列,第一列是国家,第二列是地区。假如你先转动了国家,这个时候你想得到默认选择的地区,就只能通过selectedRowInComponent来取得。(这个时候didSelectRow得到的row值,是国家那一列的)

@interface ViewController : UIViewController <UIPickerViewDataSource,UIPickerViewDelegate>

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if(component==0)
    {
        //如果是第一列,显示"中国"
        return @"中国";
    }
    else
    {
        if(row==0)
        {
            return @"北京";
        }
        else
        {
            return @"香港";
        }
    }
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    if(component==0)
    {
        NSLog(@"用户选择了第一列");
    }
    else
    {
        NSLog(@"用户选择了第二列");

        NSLog(@"用户选择了第%d行",row);
    }
}

还有一些非必要,但是也很有用的方法:
pickerView:rowHeightForComponent -- 给指定组件返回(设置)行高,单位为像素
pickerView:widthForComponent -- 给指定组件返回(设置)宽度,单位为像素
pickerView:viewForRow:viewForComponent:ReusingView -- 给指定组件和行号返回相应位置应显示的自定义视图,优先级高于pickerView:titleForRow:forComponent

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
    if(component==0)
    {
        //设置第一列的行高
        return 50;
    }
    else
    {
        return 30;
    }
}

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
    if(component==0)
    {
        //设置第一列的宽度
        return 100;
    }
    else
    {
        return 80;
    }
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    if(component==0)
    {
        //第一列返回一个Label组件
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 75, 32)];
        label.backgroundColor = [UIColor greenColor];
        label.textColor = [UIColor redColor];
        label.text = @"First";
        return label;
    }
    else
    {
        //第二列返回一个图片组件
        if(row==0)
        {
            return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Orange.gif"]];
        }
        else
        {
            return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Strawberry.gif"]];
        }
    }
}

UIDatePicker有一个实例方法setDate:animated,以编程的方式选择日期。

UIPickerView有一个实例方法selectRow:inComponent:animated,以编程的方式来选择值。

时间: 2024-10-15 15:29:34

选择器(UIPickerView)的相关文章

IOS时间选择器UIPickerView,ios8中UIView替代UIActionSheet

以前在网上下了个时间选择器Demo,由于封装成UIActionSheet类型,而ios8弃用了UIActionSheet和UIAlertView,不得不对代码进行修改.将封装的UIActionSheet改为UIView,为了多态初始化时添加了枚举(几个时间选择器样式). 以前下载的Demo网址实在找不到了,对原作者表示抱歉. 参考:DateTimeYearPickerView,UIActionSheet上添加UIPickerView iOS8替换方案 项目:点击下载 UIActionSheet改

iOS-自己定义键盘选择器

目标样式: 直接上代码: 遵守协议 <UIPickerViewDataSource,UIPickerViewDelegate> 实现方法 //创建 UITextField 设置setInputAccessoryView 为自己定义Toolbar 而且将键盘样式更改为键盘选择器 -(void)creatTextField{ UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 64, [UIScree

【IOS 开发】基本 UI 控件详解 (UIDatePicker | UIPickerView | UIStepper | UIWebView | UIToolBar )

转载注明出处 : http://blog.csdn.net/shulianghan/article/details/50348982 一. 日期选择器 (UIDatePicker) UIDatePicker 属性截图 : 1. UIDatePicker 控件属性 (1) Mode 属性 Mode 属性 : 用于设置 UIDatePicker 模式; -- Date 属性值 : 显示日期, 不显示时间; -- Time 属性值 : 显示时间, 不显示日期; -- Date and Time 属性值

Xcode And iOS9新特性

Xcode And iOS9 1. Xcode7 新特性 > 可直接在真机上运行自己的应用,只需要有苹果账号,无需购买苹果开发者账号. > 可设置在出现 EXC_BAD_ACCESS 错误时,显示更详细的错误信息. 设置方式:XCode->Product->Scheme->Edit Scheme 左侧选择“Run” 右侧选择“Diagnostics(诊断)” 在“Runtime Sanitization(运行时净化处理)” 勾选“Enable Address Sanitize

IOS 开发指南 第5章 委托协议 数据源协议 高级视图学习

1 委托对象负责控制控件的外观和对控件的事件和状态作出反应 数据源对象是控件与应用数据(model)的桥梁,一般是必须实现的. 2 选择器 UIPickerView 为用户提供选择 1)日期选择器 UIDatePicker 设置属性检查器中的各个属性-代码 -setDateFormat:设置日期格式 -stringFromDate:获取时间 - (IBAction)onclick:(id)sender { NSDate * theDate = self.datePicker.date;获取选中日

iOS开发--UIPickerView(选择器控件) 省份和城市的做法

//UIPickerView 是一个选择器控件,它可以生成单列的选择器,也可生成多列的选择器 @interface ViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate> @property(strong,nonatomic) UIPickerView *MyPickerView; @property(strong,nonatomic) NSMutableArray *ProvinceArr;

UIPickerView(选择器)

UIPickerView也是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活. UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成. UIPickerView控件常用的属性和方法如下. Ø numberOfComponents:获取UIPickerView指定列中

swift3.0 三级联动UIPickerView城市选择器

初学swift没几天,就试着自己写了一个城市选择器,纯swift代码. ViewController.swift文件中: // // ViewController.swift // swift demo - UIPickerView之城市选择器 // // Created by 柯其谱 on 17/3/11. // Copyright ? 2017年 柯其谱. All rights reserved. // import UIKit //MARK: View life cycle class V

iOS:UIPickerView选择器的使用

通过UIPickerView选择器做的一个类似于密码锁的日期时间表 源码如下: 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate> 4 @property (strong,nonatomic) NSArray *weeks;//显示第一列的数据 5 @property (strong,nonato