知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產生價值,我們在追求其視覺表現(xiàn)的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
UIPickerView城市選擇
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):58
我應用UIPickerView寫了一個城市選擇器,可是我發(fā)明在省份滾輪滾動的時刻如不雅同時再滾動城市滾輪會崩潰,代碼如下:
@interface GLViewController ()<UIPickerViewDataSource, UIPickerViewDelegate> @property (nonatomic, strong) NSArray *provinces; @property (nonatomic, weak) UIPickerView *pickerView; @end @implementation GLViewController - (void)viewDidLoad { [super viewDidLoad]; // 1.創(chuàng)建pickerview // pickerview有默認的frame UIPickerView *pickerView = [[UIPickerView alloc] init]; pickerView.dataSource = self; pickerView.delegate = self; [self.view addSubview:pickerView]; self.pickerView = pickerView; } #pragma mark - UIPickerViewDataSource // 告訴體系有若干列 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; } // 告訴體系有若干行 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (0 == component) { // 省份列 return self.provinces.count; }else { // 城市列 // 獲取第0列選中的行 NSInteger selectIndex = [self.pickerView selectedRowInComponent:0]; // 1.根據(jù)第0列選中的行數(shù)獲取對應的省 NJProvince *province = self.provinces[selectIndex]; // 2.獲取對應省份對應的城市 NSArray *cities = province.cities; // 3.返回城市的個數(shù)r return cities.count; } } #pragma mark - UIPickerViewDelegate // 告訴體系每一行顯示什么內容 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { NSLog(@"titleForRow"); if (0 == component) { // 省份 // 1.獲取對應行對應的省份模型 NJProvince *province = self.provinces[row]; // 2.返回省份的名稱 return province.name; }else { // 城市列 // 0.獲取第0列選中的行數(shù) NSInteger selectIndex = [pickerView selectedRowInComponent:0]; // 1.獲取對應的省份 NJProvince *province = self.provinces[selectIndex]; // 2.獲取對應的城市 return province.cities[row]; } } // 監(jiān)聽pickerView的選中 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { // 斷定是否修改了第0列(省份列) if (0 == component) { // 刷新第1列對應的數(shù)據(jù) [pickerView reloadComponent:1]; // 讓第1列滾動到第0行 [pickerView selectRow:0 inComponent:1 animated:YES]; } } #pragma mark - 懶加載 - (NSArray *)provinces { if (_provinces == nil) { // 加載資本 NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities" ofType:@"plist"]]; // 轉換為模型 NSMutableArray *models = [NSMutableArray arrayWithCapacity:array.count]; for (NSDictionary *dict in array) { NJProvince *province = [NJProvince provinceWithDictionary:dict]; [models addObject:province]; } _provinces = [models copy]; } return _provinces; } @end這個崩潰現(xiàn)象是因為省份滾輪在滾動過程中[pickerView selectedRowInComponent]一向在變更,而代勞辦法-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component只有在滾輪停止?jié)L動式才會調用,所以在滾動城市取數(shù)據(jù)過程中出現(xiàn)的數(shù)組越界,于是我用了另一種寫法:
@interface TCityPickerView ()<UIPickerViewDataSource, UIPickerViewDelegate> @property (nonatomic, weak) UIPickerView *pickerView; @property (nonatomic, strong) NSArray *citiesArray; @property (nonatomic, assign) NSInteger provinceIndex; @end @implementation TCityPickerView #pragma mark - public + (instancetype)cityPickerView { TCityPickerView *pickerView = [[TCityPickerView alloc] init]; pickerView.backgroundColor = kColorBarBg; pickerView.show = NO; pickerView.frame = CGRectMake(0, kScreenHeight - 64, kScreenWidth, 244); [pickerView hiddenPickerView]; return pickerView; } #pragma mark - lazy - (NSArray *)citysArray { if (!_citiesArray) { NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil]; _citiesArray = [NSArray arrayWithContentsOfFile:filePath]; } return _citiesArray; } #pragma mark - init - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.provinceIndex = 0; [self initSubViews]; } return self; } - (void)initSubViews { UIPickerView *picker = [[UIPickerView alloc] init]; picker.dataSource = self; picker.delegate = self; [self addSubview:picker]; self.pickerView = picker; } #pragma mark - UIPickerViewDataSource - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == 0) { return self.citysArray.count; } else { return [self.citysArray[self.provinceIndex][@"cities"] count]; } } #pragma mark - UIPickerViewDelegate - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { NSString *title = nil; if (component == 0) { title = self.citysArray[row][@"name"]; } else { title = self.citysArray[self.provinceIndex][@"cities"][row]; } return title; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (component == 0) { self.provinceIndex = [pickerView selectedRowInComponent:0]; [self.pickerView reloadComponent:1]; [self.pickerView selectRow:0 inComponent:1 animated:YES]; } } @end
相關案例查看更多
相關閱讀
- 小程序定制開發(fā)
- 汽車報廢
- 買小程序被騙
- 云南網(wǎng)站建設制作
- 網(wǎng)站建設首頁
- 昆明軟件定制公司
- 網(wǎng)站建設費用
- 云南網(wǎng)站建設首頁
- 海南小程序制作公司
- 云南小程序開發(fā)首選品牌
- 云南網(wǎng)站開發(fā)
- 網(wǎng)站建設招商
- python開發(fā)小程序
- 小程序公司
- 百度小程序開發(fā)
- 云南網(wǎng)站建設公司地址
- 昆明小程序代建
- 網(wǎng)站建設報價
- 區(qū)塊鏈
- 網(wǎng)站建設開發(fā)
- 云南網(wǎng)站制作
- 百度小程序
- 安家微信小程序
- 網(wǎng)站建設特性
- 汽車拆解管理系統(tǒng)
- 小程序定制
- 云南網(wǎng)站建設方法
- 報廢車管理
- web學習路線
- 網(wǎng)絡公司