亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS三級聯動選擇器的實現代碼示例

2020-07-26 02:42:48
字體:
來源:轉載
供稿:網友

無聊ing...封裝個省市區三級聯動選擇器的小demo吧。

上家公司的三級地區選擇器的數據是一次性通過網絡請求就能獲取到的,但新東家這邊并不是,而是先選擇了省獲取省的Id再去獲取市,再通過得到市的Id獲取區域,show code之前,先看下需要考慮的幾個點:

1)怎么設置默認值,關鍵代碼

[self.pickerView selectRow:xxx inComponent:xxx animated:YES];

2)怎么讓三級之間聯動 ,關鍵代碼

復制代碼 代碼如下:

[self pickerView:self.pickerView didSelectRow:0 inComponent:0 ];//聯動輪子1  必須得本輪有數據后觸發否則crash

先看下效果圖


關于設置默認值,三級聯動,用UIPickView的話就是有3個輪子(component),首先我們要想到,第一次向后臺發起請求,我們只能獲取到第0個component的數據,只有當你滾動輪子的時候才會獲取到省的Id發起請求來獲得該省的市的數據,也就是第1個component的數據,依此類推,滾動第1個component發起請求來獲取第2個component的數據,因此,pickView的監聽輪子滾動的代理起了重要作用

復制代碼 代碼如下:

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

我們通過接口獲取第0個component的數據,這邊是后臺規定的使用id=0,獲取到以后,默認選中第0個component的第0個row并主動調用觸發pick的輪子滾動代理來聯動第1個component【要在獲取數據成功后再執行這部操作,因此放在數據請求成功的回調內】,代碼為

 [self pickerView:self.pickerView didSelectRow:0 inComponent:0 ];

在各輪子滾動過程中,用一個中間值

_selectedRow0記錄下第0個component的選中行

_selectedRow1記錄下第1個component的選中行

_selectedRow2記錄下第2個component的選中行,

這里需要記住,滾動某個輪子只能對它后面的輪子產生影響,所以當滾動第0個component的時候使_selectedRow1,_selectedRow2均置為0,這里注意,上面提到的

默認選中第0個component的第0個row并主動調用觸發pick的輪子滾動代理來聯動第1個component

要先將輪子上的數據渲染好,設置好默認值才能主動調用監聽輪子滾動的代理,否則會導致崩潰,另一個防崩潰的點如下圖


發現第三級沒數據的時候,如果你在代碼里沒加【安全措施】,那也會導致崩潰,要在請求到第三級的數據后做下判斷,如果個數為空,將該級對應的數據源置為nil。(其它兩級的輪子最好也加判斷)

最后,由于這是個封裝的類,最終要得到選中的詳細信息,可通過代理或block傳值給controller。

又是你們最喜歡show code環節:

.h文件

#import <UIKit/UIKit.h>//定制代理協議@protocol ZLMAddressPickerViewDelegate <NSObject>- (void)addressPickerViewDidSelected:(NSString *)areaName;//點擊上方完成按鈕的代理傳回拼接好的選中地址- (void)addressPickerViewDidClose;//點擊關閉代理@end@interface ZLMAddressPickerView : UIView@property (weak, nonatomic) id<ZLMAddressPickerViewDelegate> delegate;@end

.m文件

#import "ZLMAddressPickerView.h"#import "AFHttpUtils.h"#import "AreaModel.h"@interface ZLMAddressPickerView () <UIPickerViewDataSource, UIPickerViewDelegate>@property (strong, nonatomic) UIPickerView *pickerView;@property (strong, nonatomic) AreaModel  *provBridge;@property (strong, nonatomic) AreaModel  *cityBridge;@property (strong, nonatomic) AreaModel  *areaBridge;@property (copy, nonatomic) NSArray<Area *> * provDataArr;//省數組@property (copy, nonatomic) NSArray<Area *> * cityDataArr;//市數組@property (copy, nonatomic) NSArray<Area *> * areaDataArr;//區數組@end@implementation ZLMAddressPickerView{  NSInteger _selectRow0;//記錄第0個輪子的選擇行  NSInteger _selectRow1;  NSInteger _selectRow2;  NSString *_areaString;//最后要傳回的詳細地址拼接字符串  Area *_proModel;//記錄下選中省的數據  Area *_cityModel;  Area *_areaModel;}- (instancetype)initWithFrame:(CGRect)frame{  self = [super initWithFrame:frame];  if (self) {    [self setup];  }  return self;}- (void)setup {   _selectRow0 = 0;  _selectRow1 = 0;  _selectRow2 = 0;  self.backgroundColor  = [UIColor whiteColor];  UIToolbar *toolbar   = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), 44)];  toolbar.backgroundColor = [UIColor whiteColor];  [self addSubview:toolbar];    UIBarButtonItem *closeItem   = [[UIBarButtonItem alloc] initWithTitle:@"關閉" style:UIBarButtonItemStylePlain target:self action:@selector(selectAddressClose)];  UIBarButtonItem *completeItem  = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStylePlain target:self action:@selector(selectAddressComplete)];  UIBarButtonItem *spaceItem   = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];  toolbar.items                     = @[closeItem, spaceItem, 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 {    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary: @{@"id":@(0)} ];    [AFHttpUtils sendPostTaskWithUrl:[NSString stringWithFormat:@"%@/app/member/area",BASE_DOMAIN_URL] paramenters:dic successHandle:^(NSURLSessionDataTask *task, id responseObject) {         NSLog(@"PROV:%@",responseObject);        self.provBridge = [AreaModel mj_objectWithKeyValues:responseObject];        if (self.provBridge.error_code==0) {            self.provDataArr=self.provBridge.data;             [self pickerView:self.pickerView didSelectRow:0 inComponent:0 ];//聯動輪子1 必須得本輪有數據后才能觸發didselect            [self.pickerView reloadAllComponents];      }  } errorHandle:^(NSError *error) {      }];}/*市*/- (void)downloadCityWithId:(NSInteger)provId {    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary: @{@"id":@(provId)} ];    [AFHttpUtils sendPostTaskWithUrl:[NSString stringWithFormat:@"%@/app/member/area",BASE_DOMAIN_URL] paramenters:dic successHandle:^(NSURLSessionDataTask *task, id responseObject) {        NSLog(@"CITY:%@",responseObject);        self.cityBridge = [AreaModel mj_objectWithKeyValues:responseObject];      if (self.cityBridge.error_code==0) {            self.cityDataArr=self.cityBridge.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.area_id];          }  } errorHandle:^(NSError *error) {      }];  }/*區*/- (void)downloadAreaWithId:(NSInteger)cityId {    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary: @{@"id":@(cityId)} ];    [AFHttpUtils sendPostTaskWithUrl:[NSString stringWithFormat:@"%@/app/member/area",BASE_DOMAIN_URL] paramenters:dic successHandle:^(NSURLSessionDataTask *task, id responseObject) {        NSLog(@"AREA:%@",responseObject);        self.areaBridge = [AreaModel mj_objectWithKeyValues:responseObject];        if (self.areaBridge.error_code==0&&self.areaBridge.data.count>0) {            self.areaDataArr=self.areaBridge.data;          }else{            self.areaDataArr=nil;          }    [self.pickerView reloadComponent:2];        [self.pickerView selectRow:0 inComponent:2 animated:YES];        [self pickerView:self.pickerView didSelectRow:0 inComponent:2 ];    } errorHandle:^(NSError *error) {      }];  }#pragma mark - events response- (void)selectAddressComplete {  [self.delegate addressPickerViewDidSelected:_areaString];}- (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 36;}//確定每個輪子的每一項顯示什么內容- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component{    NSDictionary * attrDic = @{NSForegroundColorAttributeName:[UIColor blackColor],                NSFontAttributeName:[UIFont systemFontOfSize:12]};  Area *area;  if (component==0) {    area = self.provDataArr[row];      }else if(component==1){    area = self.cityDataArr[row];      }else{    area = self.areaDataArr[row];     }   NSAttributedString * attrString = [[NSAttributedString alloc] initWithString:area.name                         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.area_id];        }else if(component==1){        _selectRow1 = [pickerView  selectedRowInComponent:1];        _selectRow2 = 0;        _cityModel = self.cityDataArr[_selectRow1];         [self downloadAreaWithId:_cityModel.area_id];      }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.name,_cityModel.name];   }else{   _areaString = [NSString stringWithFormat:@"%@ %@ %@",_proModel.name,_cityModel.name,_areaModel.name];   }}#pragma mark - getters and setters- (UIPickerView *)pickerView {  if (_pickerView == nil) {    _pickerView = [[UIPickerView alloc] init];    _pickerView.delegate  = self;    _pickerView.dataSource = self;      }  return _pickerView;}@end

最后在controller中調用

(1)導入

#import "ZLMAddressPickerView.h"

(2)定義一個對象并遵守代理協議

@property (strong, nonatomic) ZLMAddressPickerView *addressPickerView;

(3)懶加載生成對象(個人習慣)

- (ZLMAddressPickerView *)addressPickerView {  if (!_addressPickerView) {    _addressPickerView     = [[ZLMAddressPickerView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT-244-64, SCREEN_WIDTH, 244)];    _addressPickerView.delegate = self;  }  return _addressPickerView;}

(4)在點擊跳出三級聯動選擇器的地方

 [self.view addSubview:self.addressPickerView];

(5)別忘了實現代理

#pragma mark - ZLMAddressPickerViewDelegate- (void)addressPickerViewDidSelected:(NSString *)areaName {  self.areaLabel.text = areaName;//將傳回的詳細地址字符串賦值  [self addressPickerViewDidClose];}- (void)addressPickerViewDidClose {  [self.addressPickerView removeFromSuperview];}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品黄网在线观看| 日韩精品视频在线观看免费| 欧美亚洲国产成人精品| 在线观看国产精品日韩av| 欧美在线视频免费观看| 精品视频久久久久久久| 91精品国产91久久久久久吃药| 深夜成人在线观看| 亚洲精品女av网站| 日韩最新免费不卡| 精品国内亚洲在观看18黄| 久久青草福利网站| 一区二区成人av| 国产91色在线|| 亚洲精品视频中文字幕| 亚洲福利在线视频| 丝袜美腿精品国产二区| 亚洲精品国产品国语在线| 成人性生交大片免费看小说| 日本欧美中文字幕| 精品久久久av| 午夜精品久久久久久久99黑人| 成人免费观看a| 91精品久久久久久久久不口人| 日本高清视频精品| 精品亚洲男同gayvideo网站| 午夜精品久久久久久久久久久久久| 欧美日韩国产丝袜美女| 日韩电影中文字幕在线| 亚洲美女av在线播放| 日韩免费av一区二区| 一区二区国产精品视频| 国产精品欧美日韩一区二区| 成人久久精品视频| 亚洲最新在线视频| 久久久精品一区| 国产亚洲一级高清| 色狠狠av一区二区三区香蕉蜜桃| 欧美性猛交xxxx乱大交| 热久久免费视频精品| 69av成年福利视频| 久久久久久噜噜噜久久久精品| 91精品国产自产在线老师啪| 亚洲综合在线中文字幕| 久久亚洲一区二区三区四区五区高| 亚洲激情在线视频| 亚洲香蕉成人av网站在线观看| 精品国产网站地址| 国产亚洲美女精品久久久| 国产精品福利在线观看网址| 日韩欧美成人区| 亚洲第一男人av| 欧美成人小视频| 欧美国产日韩二区| 久热99视频在线观看| 国产精品一区二区电影| 中文字幕欧美日韩va免费视频| 久久久噜噜噜久久久| 97精品在线视频| 91香蕉嫩草影院入口| 久久国产精品久久久久久| 91免费在线视频网站| 精品国产一区二区三区在线观看| 亚洲精品www久久久久久广东| 91在线色戒在线| 国产高清在线不卡| 国产在线观看91精品一区| 欧美成人性色生活仑片| 日本久久91av| 久久精品2019中文字幕| 高清视频欧美一级| 欧美极品在线播放| 久久国产精品久久久久久久久久| 国产精品国产福利国产秒拍| 欧美视频在线观看免费网址| 国产精品极品美女在线观看免费| 久久精品中文字幕一区| 色综合久久精品亚洲国产| 91av网站在线播放| 久久频这里精品99香蕉| 日本欧美国产在线| 亚洲精品福利在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲午夜未满十八勿入免费观看全集| 亚洲成人av在线播放| 欧美人与物videos| 国产一区在线播放| 96国产粉嫩美女| 91精品国产91久久久久久吃药| 亚洲一级片在线看| 日韩精品在线观看一区| 欧美大片在线免费观看| 日韩在线观看免费高清完整版| 欧美中文字幕视频| 欧美成人精品不卡视频在线观看| 中文日韩在线观看| 日韩在线视频导航| 中文在线不卡视频| 国产成人精品av| 日韩精品在线看| 亚洲春色另类小说| 黑人巨大精品欧美一区二区| 黑人巨大精品欧美一区免费视频| 亚洲第一国产精品| 欧美成人免费小视频| 国内成人精品一区| 欧美精品激情blacked18| 欧美黑人视频一区| 欧美乱妇40p| 亚洲高清色综合| 日本成人黄色片| 高清视频欧美一级| 亚洲国产日韩欧美在线99| 亚洲黄在线观看| 91久久精品美女| 自拍偷拍亚洲一区| 国产精品美女免费视频| 国产精品海角社区在线观看| 性欧美xxxx交| 这里只有精品在线播放| 国产精品成人va在线观看| 中文字幕欧美专区| 欧美激情国产高清| 国产女人18毛片水18精品| 亚洲欧洲国产精品| 超碰97人人做人人爱少妇| 国产91九色视频| 欧美中文字幕视频在线观看| 精品国内自产拍在线观看| 欧美猛交ⅹxxx乱大交视频| 91亚洲精品久久久| 欧美日韩国产一区在线| 狠狠躁18三区二区一区| 久久综合电影一区| 97超级碰碰人国产在线观看| 亚洲一区二区三区久久| 日韩有码片在线观看| 色久欧美在线视频观看| 国产一区二区在线播放| 久色乳综合思思在线视频| 91av国产在线| 中文字幕亚洲第一| 亚洲人成电影网站色…| 91精品国产91久久| 九九热99久久久国产盗摄| 97在线视频免费观看| 欧美理论电影在线播放| 国产一区二区三区四区福利| 日韩中文字幕国产| 亚洲国产成人在线播放| 亚洲欧美一区二区三区情侣bbw| 精品美女永久免费视频| 久久精品国产欧美亚洲人人爽| 欧亚精品在线观看| 久久天堂电影网| 欧美黑人一区二区三区| 久久久影视精品| 久久精品中文字幕| 成人福利在线观看| 97精品国产97久久久久久免费| 欧美视频中文在线看| 麻豆一区二区在线观看| 日本免费在线精品| 国产suv精品一区二区|