此次的需求,是省市區三級聯動選擇,而且市的選擇要根據省的id,而後區的選擇要根據市的idjson
每次都要進行網絡請求,關鍵代碼,實際上是api
//監聽輪子的移動數組
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;網絡
而後我就上傳個人代碼,這個代碼我也是根據別人的修改的,由於需求不同字體
1,建立一個Viewatom
//url
// IWAreaPickerView.hspa
// InternetBank代理
//component
// Created by zmit on 2017/9/8.
// Copyright © 2017年 CreditCloud. All rights reserved.
//
#import <UIKit/UIKit.h>
//定製代理協議
@protocol IWAreaPickerViewDelegate <NSObject>
- (void)addressPickerViewDidSelected:(NSString *)areaName withDic:(NSDictionary *)info;//點擊上方完成按鈕的代理傳回拼接好的選中地址
- (void)addressPickerViewDidClose;//點擊關閉代理
@end
@interface IWAreaPickerView : UIView
@property (weak, nonatomic) id<IWAreaPickerViewDelegate> delegate;
@end
//
// IWAreaPickerView.m
// InternetBank
//
// Created by zmit on 2017/9/8.
// Copyright © 2017年 CreditCloud. All rights reserved.
//
#import "IWAreaPickerView.h"
#import "ProvincesModel.h" //省的json類型
#import "CitysModel.h" //市的json類型
#import "AreasModel.h" // 區的json類型
#import "APIClient.h"
static const NSInteger KProvinceComponent = 0;
static const NSInteger KCityComponent = 1;
static const NSInteger KDistrictComponent = 2;
#define KFont14 [UIFont systemFontOfSize:14]
@interface IWAreaPickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
@property (strong, nonatomic) UIPickerView *pickerView;
@property (strong, nonatomic) ProvinceModel *provBridge;
@property (strong, nonatomic) CityModel *cityBridge;
@property (strong, nonatomic) AreaModel *areaBridge;
@property (strong, nonatomic) NSMutableArray *provDataArr;//省數組
@property (strong, nonatomic) NSMutableArray *cityDataArr;//市數組
@property (strong, nonatomic) NSMutableArray * areaDataArr;//區數組
@end
@implementation IWAreaPickerView
{
NSInteger _selectRow0;//記錄第0個輪子的選擇行
NSInteger _selectRow1;
NSInteger _selectRow2;
NSString *_areaString;//最後要傳回的詳細地址拼接字符串
NSDictionary *_infoDic;
ProvinceModel *_proModel;//記錄下選中省的數據
CityModel *_cityModel;
AreaModel *_areaModel;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setup];
self.provDataArr = [[NSMutableArray alloc]init];
self.cityDataArr = [[NSMutableArray alloc]init];
self.areaDataArr = [[NSMutableArray alloc]init];
}
return self;
}
- (void)setup {
_selectRow0 = 0;
_selectRow1 = 0;
_selectRow2 = 0;
self.backgroundColor = [UIColor colorWithRed:222/255.0 green:227/255.0 blue:237/255.0 alpha:1.0];
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), 44)];
toolbar.backgroundColor = [UIColor clearColor];
[self addSubview:toolbar];
UIBarButtonItem *closeItem = [[ UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"icon_x"] style:UIBarButtonItemStylePlain target:self action:@selector(selectAddressClose)];
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *titleItem = [[UIBarButtonItem alloc] initWithTitle:@"選擇所在地區" style:UIBarButtonItemStylePlain target:self action:@selector(selectAddressClose)];
UIBarButtonItem *spaceItem2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *completeItem = [[ UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"icon_right"] style:UIBarButtonItemStylePlain target:self action:@selector(selectAddressComplete)];
toolbar.items = @[closeItem, spaceItem,titleItem,spaceItem2, completeItem];
self.pickerView.frame = CGRectMake(0, 44, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) - 44);
[self addSubview:self.pickerView];
[self downloadProv];
}
#pragma mark - http methods
/*省*/
- (void)downloadProv
{
NSString *url = [[APIClient instance]apiEnjoyAddressOfGetProvice:@"IOS" withPromotion:@"0000"];
[self.provDataArr removeAllObjects];
[[APIClient instance]getGoodsProvince:url success:^(ProvincesModel *result)
{
if (result)
{
[self.provDataArr addObjectsFromArray:result.data];
[self pickerView:self.pickerView didSelectRow:0 inComponent:0 ];//聯動輪子1 必須得本輪有數據後才能觸發didselect
[self.pickerView reloadAllComponents];
}
} failure:^(NSString *error) {
}];
}
/*市*/
- (void)downloadCityWithId:(NSString *)provId
{
NSString *url = [[APIClient instance]apiEnjoyAddressOfGetCitiesByProvinceCode:provId withDeviceType:@"IOS" withPromotion:@"0000"];
[self.cityDataArr removeAllObjects];
[[APIClient instance]getGoodsCity:url success:^(CitysModel *result)
{
if (result)
{
[self.cityDataArr addObjectsFromArray:result.data];
[self.pickerView reloadComponent:1];
[self.pickerView selectRow:0 inComponent:1 animated:YES];//默認選擇row0
[self pickerView:self.pickerView didSelectRow:0 inComponent:1 ];//聯動輪子2 必須得本輪有數據後才能觸發didselect
_cityModel = self.cityDataArr[_selectRow1];
[self downloadAreaWithId:_cityModel.cityCode];
}
} failure:^(NSString *error) {
}];
}
/*區*/
- (void)downloadAreaWithId:(NSString *)cityId
{
NSString *url = [[APIClient instance]apiEnjoyAddressOfGetAreaByCityCode:cityId withDeviceType:@"IOS" withPromotion:@"0000"];
[self.areaDataArr removeAllObjects];
[[APIClient instance]getGoodsArea:url success:^(AreasModel *result)
{
if (result)
{
[self.areaDataArr addObjectsFromArray:result.data];
[self.pickerView reloadComponent:2];
[self.pickerView selectRow:0 inComponent:2 animated:YES];
[self pickerView:self.pickerView didSelectRow:0 inComponent:2 ];
}
} failure:^(NSString *error) {
}];
}
#pragma mark - events response
- (void)selectAddressComplete {
[self.delegate addressPickerViewDidSelected:_areaString withDic:_infoDic];
}
- (void)selectAddressClose {
[self.delegate addressPickerViewDidClose];
}
#pragma mark - UIPickerViewDataSource
//肯定picker的輪子個數
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 3;
}
//肯定picker的每一個輪子的item數
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if (component==0) {
return self.provDataArr.count;
}else if(component==1){
return self.cityDataArr.count;
}else{
return self.areaDataArr.count;
}
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
return 40;
}
//肯定每一個輪子的每一項顯示什麼內容
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component{
NSDictionary * attrDic = @{NSForegroundColorAttributeName:[UIColor blackColor],NSFontAttributeName:[UIFont systemFontOfSize:6]};
ProvinceModel *provice = [[ProvinceModel alloc]init];
CityModel *city = [[CityModel alloc]init];
AreaModel *area = [[AreaModel alloc]init];
NSAttributedString * attrString;
if (component==0) {
provice = (ProvinceModel *)self.provDataArr[row];
attrString = [[NSAttributedString alloc] initWithString:provice.provinceName attributes:attrDic];
}else if(component==1){
city = (CityModel *)self.cityDataArr[row];
attrString = [[NSAttributedString alloc] initWithString:city.cityName attributes:attrDic];
}else{
area = (AreaModel *)self.areaDataArr[row];
attrString = [[NSAttributedString alloc] initWithString:area.areaName attributes:attrDic];
}
return attrString;
}
//監聽輪子的移動
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
if (component==0) {
_selectRow0 = [pickerView selectedRowInComponent:0];
_selectRow1 = 0;
_selectRow2 = 0;
_proModel = self.provDataArr[_selectRow0];
[self downloadCityWithId:_proModel.provinceCode];
}else if(component==1){
_selectRow1 = [pickerView selectedRowInComponent:1];
_selectRow2 = 0;
_cityModel = self.cityDataArr[_selectRow1];
[self downloadAreaWithId:_cityModel.cityCode];
}else{
_selectRow2 = [pickerView selectedRowInComponent:2];
if (self.areaDataArr&&self.areaDataArr.count>0) {
_areaModel = self.areaDataArr[_selectRow2];
}else{
_areaModel = nil;
}
}
if(_areaModel==nil){
_areaString = [NSString stringWithFormat:@"%@%@",_proModel.provinceName,_cityModel.cityName];
if (_proModel && _cityModel)
{
_infoDic = @{
@"proID":_proModel.provinceCode,
@"cityId":_cityModel.cityCode,
};
}
NSLog(@"_info=%@",_infoDic);
}else{
_areaString = [NSString stringWithFormat:@"%@%@%@",_proModel.provinceName,_cityModel.cityName,_areaModel.areaName];
if (_proModel && _cityModel && _areaModel)
{
_infoDic = @{
@"proID":_proModel.provinceCode,
@"cityId":_cityModel.cityCode,
@"areaId":_areaModel.areaCode,
};
}
NSLog(@"_info=%@",_infoDic);
}
}
//修改字體樣式
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *myView = nil;
CGFloat myViewW = pickerView.frame.size.width *0.33;
CGFloat myViewH = 60;
myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, myViewW, myViewH)];
myView.font = KFont14;
myView.backgroundColor = [UIColor clearColor];
myView.textAlignment = NSTextAlignmentCenter;
if (component == KProvinceComponent) {
self.provBridge = [_provDataArr objectAtIndex:row];
myView.text = self.provBridge.provinceName;
}
else if (component == KCityComponent) {
self.cityBridge = [_cityDataArr objectAtIndex:row];
myView.text = self.cityBridge.cityName;
}
else {
self.areaBridge = [_areaDataArr objectAtIndex:row];
myView.text = self.areaBridge.areaName;
}
return myView;
}
#pragma mark - getters and setters
- (UIPickerView *)pickerView {
if (_pickerView == nil) {
_pickerView = [[UIPickerView alloc] init];
_pickerView.delegate = self;
_pickerView.dataSource = self;
}
return _pickerView;
}
@end
VC中的實現
{ NSLog(@"選擇地址");
[[UIApplication sharedApplication].keyWindow addSubview:self.maskView];
_areaPickerView = [[IWAreaPickerView alloc] initWithFrame:CGRectMake(0, kDeviceHeight - 350, self.view.frame.size.width, 350)];
_areaPickerView.delegate = self;
[self.maskView addSubview:_areaPickerView];
}
/***********************代理的實現***********************/
#pragma mark - IWAreaPickerViewDelegate
- (void)addressPickerViewDidSelected:(NSString *)areaName withDic:(NSDictionary *)info{
addressInfo = [NSDictionary dictionaryWithDictionary:info];
NSLog(@"areaName = %@",areaName);
addAddressView.nFlag = @"have";
addAddressView.addressInfo = areaName;
[self addressPickerViewDidClose];
}