自定义城市键盘

// 模型数据
// LZCityItem.h
#import 

@interface LZCityItem : NSObject

/** 城市*/
@property (nonatomic, strong) NSArray *cities;
/** 省名称*/
@property (nonatomic, strong) NSString *name;

// 快速构建
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)cityItemWithDict:(NSDictionary *)dict;

@end


// LZCityItem.m
#import "LZCityItem.h"

@implementation LZCityItem

// 快速构建
- (instancetype)initWithDict:(NSDictionary *)dict
{
    if (self = [super init]) {
        // KVC
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}

+ (instancetype)cityItemWithDict:(NSDictionary *)dict
{
    return [[self alloc] initWithDict:dict];
}

@end


// LZCityTextF.h
#import 

@interface LZCityTextF : UITextField

@end

// LZCityTextF.m
#import "LZCityTextF.h"
#import "LZCityItem.h"

@interface LZCityTextF () 

/** 城市数组*/
@property (nonatomic, strong) NSArray *cityArray;
/** 选中的行,表示选中的省*/
@property (nonatomic, assign) NSInteger selectedRow;

@end

@implementation LZCityTextF

#pragma mark - 懒加载数据
- (NSArray *)cityArray
{
    if (_cityArray == nil) {
        NSString *path =  [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil];
        NSArray *array =  [NSArray arrayWithContentsOfFile:path];
        NSMutableArray *tempArray = [NSMutableArray array];
        for (NSDictionary *dict in array) {
            //把字典转成模型
            LZCityItem *item = [LZCityItem cityItemWithDict:dict];
            [tempArray addObject:item];
        }
        _cityArray = tempArray;
    }
    return _cityArray;
}

// 代码创建的时候调用
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

// 从storyboard或者xib中创建的时候调用
- (void)awakeFromNib
{
    [self setup];
}

// 设置
- (void)setup
{
    UIPickerView *pickV = [[UIPickerView alloc] init];
    pickV.dataSource = self;
    pickV.delegate = self;
    //修改键盘的类型
    self.inputView = pickV;
}

#pragma mark - UIPickerViewDataSource 方法
// 多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

// 每列多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == 0) {
        // 如果是第0列,表示的是省的个数
        return self.cityArray.count;
    } else {
        // 如果是第1列,表示的是市的个数
        // 思路,首先得确定第0列选中的行,通过一个成员属性来保存
        // 1.拿到选中的省
        LZCityItem *item = self.cityArray[self.selectedRow];
        // 特定省该城市的所有个数
        return item.cities.count;
    }
}

// 每行显示标题
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == 0) {
        // 选中第0列第row行
        // row表示第0列选中的行
        LZCityItem *item = self.cityArray[row];
        return item.name;
    }else {
        // 第1列
        // 思路,首先得确定第0列选中的行,通过一个成员属性来保存
        // 选中特定的省
        LZCityItem *item = self.cityArray[self.selectedRow];
        // 选中的特定的省的特定的市
        // row表示第1列选中的行
        return item.cities[row];
    }
}

// 选中某一行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    if (component == 0) {
        // 第0列 这里面的row表示的是第0列选中的行
        self.selectedRow = row;
        // 刷新
        [pickerView reloadAllComponents];
        // 设置第1列默认滚到第0行
        [pickerView selectRow:0 inComponent:1 animated:YES];
    }

    // 通过特定的行来选中特定的省
    LZCityItem *item = self.cityArray[self.selectedRow];

    // 拿到第1列选中的行
    NSInteger selRow = [pickerView selectedRowInComponent:1];

    self.text = [NSString stringWithFormat:@"%@-%@", item.name, item.cities[selRow]];
}

@end


效果图片:

自定义城市键盘_第1张图片

你可能感兴趣的:(自定义城市键盘)