UIPickview 省市联动注意点(如何防止同时两组或多组滑动时,数组越界问题)
来源:互联网 发布:ip归属地数据库 离线 编辑:程序博客网 时间:2024/05/29 10:34
#import "ViewController.h"#import "PREProvince.h"@interface ViewController ()<UIPickerViewDataSource , UIPickerViewDelegate>@property (weak, nonatomic) IBOutlet UIPickerView *provinceView;@property (weak, nonatomic) IBOutlet UILabel *provinceLabel;@property (weak, nonatomic) IBOutlet UILabel *cityLabel;@property(nonatomic ,strong)NSArray *provinces;
@property(nonatomic ,strong)PREProvince * oldProvince;@end@implementation ViewController
//懒加载数据
-(NSArray *)provinces{ if (!_provinces) { _provinces = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"02cities.plist" ofType:nil]]; NSMutableArray * tempArr = [NSMutableArray arrayWithCapacity:self.provinces.count]; for (NSDictionary * dict in _provinces) { PREProvince * province = [PREProvince provinceWithDict:dict]; [tempArr addObject:province]; } _provinces = tempArr; } return _provinces; }//UIPickView的数据源方法(返回组) (第一组为省,第二组为省对应的城市)-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 2;}
//数据源方法 (返回行)-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ NSLog(@"返回行");
//判断哪一组,根据组返回对应的行数 if (component ==0) { return self.provinces.count; }else{
// 获取此时第一组选择的索引 NSInteger index =[pickerView selectedRowInComponent:0]; //创建一个模型对象来接收此时模型数组索引所对应的模型对象 PREProvince * oldPro =self.provinces[index];
// 声明一个成员属性来存储这个模型对象 self.oldProvince = oldPro; return [self.provinces[index] cities].count; }} // 代理方法 (返回对象组中的每一行的显示的字符串)-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ NSLog(@"显示"); if (component ==0) { return [self.provinces[row] name]; }else{ // NSInteger index = [pickerView selectedRowInComponent:0];
//这里为什么不是行代码 ,是因为当我们两组同时滑动时,此时就会出现数组越界问题,导致程序奔溃,为了避免用户两组同时滑动,// return [self.provinces[index] cities][row];
// 在这里就是用之前保存下来的模型对象,来返回对应的行的字符串,由于该方法会不只一次被调用,当滑动停止时,在下面的方法中会更新组中的数据的显示 return self.oldProvince.cities[row]; } } //选择对应某一组的某一行调用此方法-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
//根据判断对应的组,
if (component==0) {
//由于我们第一组是省,所以省变化后,需要将城市进行刷新,也就是刷新第二组 [self.provinceView reloadComponent:1]; self.provinceLabel.text =[self.provinces[row] name]; } // NSInteger index = [pickerView selectedRowInComponent:0]; NSInteger indexCity = [pickerView selectedRowInComponent:1]; // 在这里我们不能通过获取第一组的索引来确定第二组的数据,这样当两组同时滑动时,也会出现数据越界问题,所以还需要通过保存的模型对象来确定显示的内容
self.cityLabel.text = self.oldProvince.cities[indexCity];}
0 0
- UIPickview 省市联动注意点(如何防止同时两组或多组滑动时,数组越界问题)
- 省市二级及联动(省市对应数组)
- 递归时要注意数组越界
- 工具类:防止数组越界崩溃问题(NSArray 分类/runtime 用法3:交换方法)
- iOS中防止数组越界
- [C] 使用pcaplib的pacp_next_ex()针对TCAP开发时要注意的数组越界问题
- 两道“诡异”的数组越界问题的分析
- Objective-c防止数组越界而崩溃(全局效果)
- 一个数组越界问题 数组越界
- 数组越界那点事儿
- 数组访问越界问题
- 数组越界问题
- 数组访问越界问题
- c++ 数组越界问题
- Java数组越界问题
- STM32数组越界问题
- 解决数组越界问题
- 数组越界问题
- BZOJ_P2561 最小生成树(网络流+最大流ISAP)
- java多线程面试问题
- WAMP Version 2.5 Version Française
- 封装通信接口数据的方法-xml
- IOS第三天_面向对象1
- UIPickview 省市联动注意点(如何防止同时两组或多组滑动时,数组越界问题)
- 第2章{ 2-9 别名机制 }
- HDOJ 1006 Tick and Tick
- Android Studio的开发视图中,顶部工具栏不见了如何设置回来
- js模拟Ctrl+C复制、Ctrl+V粘贴功能之tabindex、focus、keyCode
- codevs2306晨跑(SDOI2009)
- 结合整理的css用border画三角形的原理
- codeforces622E Ants in Leaves (dfs)
- 04环信聊天界面 - 完善聊天输入框