UIPickerView - 城市选择

这里写图片描述

  • 城市数据模型
#import <Foundation/Foundation.h>

@interface WQProvinceData : NSObject
/** 城市*/
@property (nonatomic, strong) NSArray *cities;
/** 城市名称*/
@property (nonatomic, strong) NSString *name;
+ (instancetype)provinceWithDict:(NSDictionary *)dict;
@end

#import "WQProvinceData.h"

@implementation WQProvinceData
+ (instancetype)provinceWithDict:(NSDictionary *)dict
{
    WQProvinceData *provinceData = [[WQProvinceData alloc]init];
    [provinceData setValuesForKeysWithDictionary:dict];
    return provinceData;
}
@end
  • 控制器
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@end


#import "ViewController.h"
#import "WQProvinceData.h"
@interface ViewController ()<UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate>
@property (weak, nonatomic) IBOutlet UITextField *birthdayField;
/**日期选择器*/
@property (nonatomic, strong) UIDatePicker *datePicker;
/**城市显示文本框*/
@property (weak, nonatomic) IBOutlet UITextField *cityField;
/**城市数据模型*/
@property (nonatomic, strong) NSMutableArray *provinceData;

/**城市选择器*/
@property (nonatomic, strong) UIPickerView *pickerView;
/**当前选中省下标*/
@property (nonatomic, assign) NSInteger provinceIndex;
@end

@implementation ViewController
// 懒加载,省,城数据
- (NSMutableArray *)provinceData
{
    if (_provinceData == nil)
    {
        _provinceData = [NSMutableArray array];
        // 加载plist文件
        NSArray *arrFromPlist = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil]];
        // 字典转模型
        [arrFromPlist enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            WQProvinceData *data = [WQProvinceData provinceWithDict:obj];
            [_provinceData addObject:data];
        }];
    }
    return _provinceData;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // 给日期输入框设置代理
    self.birthdayField.delegate = self;
    // 设置日期键盘
    [self setUpBirthDayKeyBoard];

    // 给城市输入框设置代理
    self.cityField.delegate = self;
    // 设置城市键盘
    [self setUpCityKeyBoard];
}

// 不允许用户输入数据,只可以通过选择器选择(textField的代理方法)
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    return NO;
}
/**
 *  设置日期选择
 */
- (void)setUpBirthDayKeyBoard
{
    self.datePicker = [[UIDatePicker alloc]init];
    self.birthdayField.inputView = self.datePicker;
    self.datePicker.datePickerMode = UIDatePickerModeDate;
    self.datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
    // 给日期输入框添加监听器,用来监听数据的修改
    [self.datePicker addTarget:self action:@selector(birthdayFieldValueChange:) forControlEvents:UIControlEventValueChanged];
}

// 监听开始编辑,用来初始文本框的显示
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    if (textField == self.birthdayField) {
        [self birthdayFieldValueChange:self.datePicker];
    }else if (textField == self.cityField)
    {
        [self pickerView:self.pickerView didSelectRow:0 inComponent:0];
    }

}
// 给日期 text赋值
- (void)birthdayFieldValueChange:(UIDatePicker *)datePicker
{
    NSDate *date = datePicker.date;
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    formatter.dateFormat = @"yy-MM-dd";
    NSString *dateStr = [formatter stringFromDate:date];
    self.birthdayField.text = dateStr;
}

#pragma mark - -----城市选择器
/**
 *  设置城市键盘
 */
- (void)setUpCityKeyBoard
{
    // 修改文本输入框弹出键盘的样式
    self.pickerView = [[UIPickerView alloc]init];
    self.cityField.inputView = self.pickerView;
    // 设置数据源和代理
    self.pickerView.dataSource = self;
    self.pickerView.delegate = self;
}

// 城市选择器,只有省和该省城市两列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}
// 返回当前component列的行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == 0) {
        return self.provinceData.count;
    }else
    {
        WQProvinceData *tempData = self.provinceData[_provinceIndex];
        return tempData.cities.count;
    }
}
// 返回component列row行显示的数据
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == 0) {
        WQProvinceData *tempData = self.provinceData[row];
        return tempData.name ;
    }else
    {
        WQProvinceData *tempData = self.provinceData[_provinceIndex];
        return tempData.cities[row];
    }
}
// 滚动UIPickerView就会调用
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // 如果滚动的时省
    if(component == 0)
    {
        // 当前获取到当前选择的省的下标
        _provinceIndex = [pickerView selectedRowInComponent:0];
        // 刷新第一列城市的数据
        [self.pickerView reloadComponent:1];
        // 刷新城市后,让城市显示第一个
        [self.pickerView selectRow:0 inComponent:1 animated:YES];
    }
    // 获取当前省的数据模型
    WQProvinceData *proData = self.provinceData[_provinceIndex];
    // 获取当前城市的下标
    NSInteger cityIndex = [pickerView selectedRowInComponent:1];
    // 将数据显示到textfield上
    self.cityField.text = [NSString stringWithFormat:@"%@ - %@",proData.name, proData.cities[cityIndex]];
}
@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值