ios收貨地址三級聯動選擇

來源:互聯網
上載者:User

標籤:red   item   lex   super   級聯   arc   attribute   created   end   

這次的需求,是省市區三級聯動選擇,並且市的選擇要根據省的id,然後區的選擇要根據市的id

每次都要進行網路請求,關鍵代碼,其實是

//監聽輪子的移動

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;

然後我就上傳My Code,這個代碼我也是根據別人的修改的,因為需求不一樣

1,建立一個View

//

//  IWAreaPickerView.h

//  InternetBank

//

//  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];

}

 

ios收貨地址三級聯動選擇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.