zoukankan      html  css  js  c++  java
  • IOS笔记045-UIDatePicker和UIPickerView

    这是两种可以上下滚动的控件。

    这是UIDatePicker,可以显示日期和时间。

    屏幕快照 2015 06 09 23 45 00

    这个是UIPickerView,显示类似几个选择项的界面。

    注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。 

    屏幕快照 2015 06 09 23 45 08

    做一个简单界面进行练习。单击生日输入框弹出自定义UIDatePicker,单击城市弹出自定义UIPickerView选择城市。

    屏幕快照 2015 06 10 00 12 38

    1、UIDatePicker使用

    在点击过文本输入框后弹出日期选中键盘。需要给UITextField控件的inutView属性指定需要显示的界面。

    这里显示的代码如下:

    - (void)setBirthdayFieldKeyboard

    {

        //

        UIDatePicker *datePicker = [[UIDatePicker alloc] init];

        _datePicker = datePicker;

        // 只显示时间

        datePicker.datePickerMode = UIDatePickerModeDate;

        // 显示中文

        datePicker.locale = [NSLocalelocaleWithLocaleIdentifier:@"zh"];

        // 监听值得改变

        [datePicker addTarget:selfaction:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

        self.birthdayField.inputView = datePicker;

    }

    在程序加载时进行设定

    - (void)viewDidLoad {

        [superviewDidLoad];

        [selfsetBirthdayFieldKeyboard];

    }

    然后对UITextField的一些属性进行设置,比如说不能输入日期,只能选择显示日期。可以在以下代理方法中实现

    #pragma mark - textField代理方法

    // 是否允许修改填充字符串

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    {

        returnNO;

    }

    当然使用之前要指定代理并遵守协议。

    然后再选择过时间后,同步更新到文本输入框中,这里需要监听控件的valueChanged的方法

        [datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

    响应方法

    - (void)datePickerValueChanged:(UIDatePicker *)datePicker

    {

        NSDateFormatter *formatter = [[NSDateFormatteralloc] init];

        // 格式化日期格式

        formatter.dateFormat = @"yyyy-MM-dd";

        NSString *date = [formatter stringFromDate:datePicker.date];

        // 显示时间

        self.birthdayField.text = date;

    }

    最后要设置以下UITextField控件的默认值,默认显示0行0列的值

    在改变文本输入框状态时进行设置默认值。

    // 是否允许开始编辑(代理方法)

    - (void)textFieldDidBeginEditing:(UITextField *)textField

    {

        // 添加自定义窗口

        [selfdatePickerValueChanged:self.datePicker];

    }

    2、UIPickerView使用

    先将城市选择键盘添加到文本输入框

    // 设置城市键盘

    - (void)setCitiesFieldKeyboard

    {

        //

        UIPickerView *picker = [[UIPickerViewalloc] init];

        _cityPicker = picker;

        picker.dataSource = self;

        picker.delegate = self;

        self.cityField.inputView = picker; 

    }

    设置代理和数据源为控制器,实现响应的方法

    #pragma mark UIPickerView 数据源

    // 列数

    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

    {

        return 2;

    }

    // 某一列行数

    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component

    {

        if (component == 0// 省会

        {

            return self.provinces.count;

        }

        else  // 其他城市

        {

            SLQProvince *pro = self.provinces[_proIndex];

            return pro.cities.count;

        }

    }

    代理方法

    #pragma mark UIPickerView 代理

    // 每行的标题

    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

    {

        if (component == 0// 省会

        {

            // 获取省会

            SLQProvince *pro = self.provinces[row];

            return pro.name;

        }

        else  // 其他城市

        {

            

            SLQProvince *pro = self.provinces[_proIndex];

            return pro.cities[row];

        }

    }

    // 是否选中某行

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

    {

        // 滚动省会刷新城市

        if(component == 0)

        {

            // 记录当前省会

            _proIndex = [pickerView selectedRowInComponent:0];

            [pickerView reloadComponent:1];

        }

        

        // 获取选中省会

        SLQProvince *pro = self.provinces[_proIndex];

        NSInteger cityIndex = [pickerView selectedRowInComponent:1];

        NSString *cityName = pro.cities[cityIndex];

        _cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName];

    }

    然后在文本输入框的代理方法中添加默认显示对象

    // 是否允许开始编辑

    - (void)textFieldDidBeginEditing:(UITextField *)textField

    {

        if (textField == self.birthdayField)

        {

            // 添加自定义窗口

            [selfdatePickerValueChanged:self.datePicker];

        }

        else

        {

            [selfpickerView:self.cityPickerdidSelectRow:0inComponent:0]; // 默认显示0行0列

        }

    }

    效果

    屏幕快照 2015 06 09 23 52 15

     主要代码参考

      1 //
      2 //  ViewController.m
      3 //  KVC实现原理
      4 //
      5 //  Created by Christian on 15/6/9.
      6 //  Copyright (c) 2015年 slq. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 #import "SLQProvince.h"
     11 @interface ViewController () <UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate>
     12 
     13 @property (nonatomic,weak) UIDatePicker *datePicker;
     14 @property (nonatomic, weak) UIPickerView *cityPicker;
     15 @property (nonatomic, strong) NSMutableArray *provinces;
     16 
     17 @property (nonatomic, assign) NSInteger proIndex;
     18 
     19 @end
     20 
     21 @implementation ViewController
     22 
     23 
     24 // 懒加载省会
     25 - (NSMutableArray *)provinces
     26 {
     27     if (_provinces == nil) {
     28         // 装所有的省会
     29         _provinces = [NSMutableArray array];
     30         
     31         // 加载plist文件
     32         NSString *filePath = [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil];
     33         NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
     34         
     35         for (NSDictionary *dict in arr) {
     36             // 字典转模型
     37             SLQProvince *p = [SLQProvince provinceWithDict:dict];
     38             
     39             [_provinces addObject:p];
     40         }
     41     }
     42     return _provinces;
     43 }
     44 
     45 - (void)viewDidLoad {
     46     [super viewDidLoad];
     47     
     48     //
     49     self.birthdayField.delegate = self;
     50     self.cityField.delegate = self;
     51     //
     52     [self setBirthdayFieldKeyboard];
     53     [self setCitiesFieldKeyboard];
     54     
     55 }
     56 
     57 #pragma mark - textField代理方法
     58 // 是否允许修改填充字符串
     59 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
     60 {
     61     return NO;
     62 }
     63 // 是否允许开始编辑
     64 - (void)textFieldDidBeginEditing:(UITextField *)textField
     65 {
     66     if (textField == self.birthdayField)
     67     {
     68         // 添加自定义窗口
     69         [self datePickerValueChanged:self.datePicker];
     70     }
     71     else
     72     {
     73         [self pickerView:self.cityPicker didSelectRow:0 inComponent:0];
     74     }
     75 }
     76 
     77 #pragma mark - UIPickerView
     78 #pragma mark UIPickerView 数据源
     79 // 列数
     80 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
     81 {
     82     return 2;
     83 }
     84 // 某一列行数
     85 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
     86 {
     87     if (component == 0)  // 省会
     88     {
     89         return self.provinces.count;
     90     }
     91     else  // 其他城市
     92     {
     93         SLQProvince *pro = self.provinces[_proIndex];
     94         return pro.cities.count;
     95     }
     96 }
     97 
     98 #pragma mark UIPickerView 代理
     99 // 每行的标题
    100 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    101 {
    102     if (component == 0)  // 省会
    103     {
    104         // 获取省会
    105         SLQProvince *pro = self.provinces[row];
    106         return pro.name;
    107     }
    108     else  // 其他城市
    109     {
    110         
    111         SLQProvince *pro = self.provinces[_proIndex];
    112         return pro.cities[row];
    113     }
    114 }
    115 // 是否选中某行
    116 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    117 {
    118     // 滚动省会刷新城市
    119     if(component == 0)
    120     {
    121         // 记录当前省会
    122         _proIndex = [pickerView selectedRowInComponent:0];
    123         [pickerView reloadComponent:1];
    124     }
    125     
    126     // 获取选中省会
    127     SLQProvince *pro = self.provinces[_proIndex];
    128     NSInteger cityIndex = [pickerView selectedRowInComponent:1];
    129     NSString *cityName = pro.cities[cityIndex];
    130     _cityField.text = [NSString stringWithFormat:@"%@-%@",pro.name,cityName];
    131 }
    132 
    133 
    134 #pragma mark - 自定义方法
    135 // 设置城市键盘
    136 - (void)setCitiesFieldKeyboard
    137 {
    138     //
    139     UIPickerView *picker = [[UIPickerView alloc] init];
    140     _cityPicker = picker;
    141     picker.dataSource = self;
    142     picker.delegate = self;
    143     self.cityField.inputView = picker;
    144 }
    145 
    146 // 设置生日键盘
    147 - (void)setBirthdayFieldKeyboard
    148 {
    149     //
    150     UIDatePicker *datePicker = [[UIDatePicker alloc] init];
    151     _datePicker = datePicker;
    152     // 只显示时间
    153     datePicker.datePickerMode = UIDatePickerModeDate;
    154     // 显示中文
    155     datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
    156     // 监听值得改变
    157     [datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
    158     self.birthdayField.inputView = datePicker;
    159 }
    160 
    161 - (void)datePickerValueChanged:(UIDatePicker *)datePicker
    162 {
    163     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    164     // 格式化日期格式
    165     formatter.dateFormat = @"yyyy-MM-dd";
    166     NSString *date = [formatter stringFromDate:datePicker.date];
    167     // 显示时间
    168     self.birthdayField.text = date;
    169 }
    170 @end
    代码参考

    注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。 

     
  • 相关阅读:
    JS正则表达式大全(整理详细且实用)
    你真的会使用XMLHttpRequest吗?
    pyCharm最新激活码(2018激活码)
    Hibernate 中配置属性详解(hibernate.properties)
    c3p0详细配置
    使用Git上传本地项目到http://git.oschina.net
    深入理解Java:注解(Annotation)自定义注解入门
    SpringMVC文件上传与下载
    C语言开发系列-二进制
    C开发系列-include
  • 原文地址:https://www.cnblogs.com/songliquan/p/4564963.html
Copyright © 2011-2022 走看看