// 模型数据
// LZCityItem.h
#import <Foundation/Foundation.h>
@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 <UIKit/UIKit.h>
@interface LZCityTextF : UITextField
@end
// LZCityTextF.m
#import "LZCityTextF.h"
#import "LZCityItem.h"
@interface LZCityTextF () <UIPickerViewDataSource, UIPickerViewDelegate>
/** 城市数组*/
@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
效果图片: