无聊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
要先将轮子上的数据渲染好,设置好默认值才能主动调用监听轮子滚动的代理,否则会导致崩溃,另一个防崩溃的点如下图










