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里面每行的高度 可以改,不要弄混淆了。 

     
  • 相关阅读:
    三数之和
    罗马数字与整数
    Oracle 开启或关闭归档
    Oracle RMAN scripts to delete archivelog
    Oracle check TBS usage
    Oracle kill locked sessions
    场景9 深入RAC运行原理
    场景7 Data Guard
    场景4 Data Warehouse Management 数据仓库
    场景5 Performance Management
  • 原文地址:https://www.cnblogs.com/songliquan/p/4564963.html
Copyright © 2011-2022 走看看