pickerView滑动时,数组越界崩溃问题.

解决方法没有捷径,只能在代理方法中,需要用到“row”大的地方,做判断,返回@“”或者返回0.

如(返回title的判断用到row):- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if (pickerView==self.cityPicker){
        if (0 == component)
        {
            ProvinceModel *model = _provinceArr[row];
            return model.name;
        }
        else if(1==component)
        {
            NSInteger rowProvince = [pickerView selectedRowInComponent:0];
//            ProvinceModel *model = _provinceArr[rowProvince];
//            CityModel *cityModel = model.citiesArr[row];
//            return cityModel.name;
            if (rowProvince<_provinceArr.count) {
                ProvinceModel *model = _provinceArr[rowProvince];
                if (row<model.citiesArr.count) {
                     CityModel *cityModel = model.citiesArr[row];
                    return cityModel.name;
                }
                return @"";
            }
            return @"";
            
            
        }
        else
        {
            NSInteger rowProvince = [pickerView selectedRowInComponent:0];
            NSInteger rowCity = [pickerView selectedRowInComponent:1];
//            ProvinceModel *model = _provinceArr[rowProvince];
//            CityModel *cityModel = model.citiesArr[rowCity];
//            NSString *str = [cityModel.code description];
//            NSArray *arr = _areaDic[str];
//            AreaModel *areaModel = [[AreaModel alloc]init];
//            [areaModel setValuesForKeysWithDictionary:arr[row]];
//            return areaModel.name;
            
            if (rowProvince<_provinceArr.count) {
                ProvinceModel *model = _provinceArr[rowProvince];
                if (rowCity<model.citiesArr.count) {
                    CityModel *cityModel = model.citiesArr[rowCity];
                    NSString *str = [cityModel.code description];
                    NSArray *arr = _areaDic[str];
                    if (row<arr.count) {
                        AreaModel *areaModel = [[AreaModel alloc]init];
                        [areaModel setValuesForKeysWithDictionary:arr[row]];
                        return areaModel.name;
                    }
                    return @"";
                }
                return @"";
            }
            return @"";
            
        }return @"";
    }
    return @"";

}

再如(返回每个组件里边的元素数,用到row要判断)

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if (pickerView==self.cityPicker){
        if (0 == component)
        {
            return self.provinceArr.count;
        }
        else if(1==component)
        {
            NSInteger rowProvince = [pickerView selectedRowInComponent:0];
//            ProvinceModel *model =   self.provinceArr[rowProvince];
//            return model.citiesArr.count;
            
            if (rowProvince<self.provinceArr.count) {
                ProvinceModel *model =   self.provinceArr[rowProvince];
                return model.citiesArr.count;
            }
            return 0;
            
            
        }else
        {   NSInteger rowProvince = [pickerView selectedRowInComponent:0];
            NSInteger rowCity = [pickerView selectedRowInComponent:1];
//            ProvinceModel *model = _provinceArr[rowProvince];
//            CityModel *cityModel = model.citiesArr[rowCity];
//            NSString *str = [cityModel.code description];
//            NSArray *arr =  _areaDic[str];
//            return arr.count;
            
            if (rowProvince<_provinceArr.count) {
                ProvinceModel *model = _provinceArr[rowProvince];
                if (rowCity < model.citiesArr.count) {
                    CityModel *cityModel = model.citiesArr[rowCity];
                    NSString *str = [cityModel.code description];
                    NSArray *arr =  _areaDic[str];
                    return arr.count;
                }
                return 0;
            }
            return 0;
            
        }
        
    }
    

}


以上,注释的地方即为崩溃处.

另外温馨提示:在didselect方法里,如果有多列数据要显示的话,如3列,则在第一列选中的时候要刷新2,3列,在第2列选中的时候,要刷新第三列,以此类推,如:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    NSLog(@"row - %ld",(long)row);
    if (pickerView==self.cityPicker){
        if(0 == component)
        {
            [pickerView reloadComponent:1];
            [pickerView reloadComponent:2];
        }
        if(1 == component)
        {
            [pickerView reloadComponent:2];
        }
        
        NSInteger selectOne = [pickerView selectedRowInComponent:0];
        NSInteger selectTwo = [pickerView selectedRowInComponent:1];
        if (selectOne<_provinceArr.count) {
            ProvinceModel *model = _provinceArr[selectOne];
            if (selectTwo<model.citiesArr.count) {
                CityModel *cityModel = model.citiesArr[selectTwo];
                NSLog(@"省:%@ 市:%@ ",model.name,cityModel.name);
                self.selectCityStr = cityModel.name;
            }
        }
    }
}





更多问题,欢迎加群讨论:565191947

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PickerView (2.x系列) 精仿iOS的PickerView控件,有间选择和选项选择并支持一二三级联动效果 ——TimePickerView 间选择器,支持年月日分,年月日,年月,分等格式 ——OptionsPickerView 选项选择器,支持一,二,三级选项选择,并且可以设置是否联动 2.x是全新的3D效果,比1.x版本更加贴近iOS的效果,从外观细节上也得到了改善。api兼容1.x版本,只需要把依赖的版本号升级即可,几乎不用修改代码即可完成升级。 使用gradle 依赖: compile 'com.bigkoo:pickerview:2.0.8' Demo 图片 demo代码请看戳这里 更新说明 v2.0.0 不需修改任何代码就可以兼容1.x 外观大整改 支持反射获取getPickerViewText()来获取要展示数据,以前只能传String的对象,现在可以传任意对象只要有getPickerViewText()函数即可显示对应的字符串,如果没有getPickerViewText()函数则使用对象toString作为显示 加入setTitle v2.0.1 去掉popupWindow,改用View,类名也对应修改为TimePickerView和 OptionsPickerView 加入遮罩效果 v2.0.2 修复不循环模式下点击空白item处出现数组越界问题 修复循环模式下只有一条数据的候只显示三条而不是填充满高度问题 v2.0.3 修复间选择的候部分数字选不到直接跳到下一个数字的问题 v2.0.4 修复不循环模式下顶部超出范围问题 wheel view文字颜色通过xml配置 v2.0.5 修复不循环模式下底部超出范围问题 v2.0.6 修复不循环模式下点击超出范围问题,修复后点击空白的地方,只能滚到最顶或最底,不会滚出数据范围。 v2.0.7 修复设置初始化position ,第三级数据不对的BUG。 v2.0.8 修复#41 未选中项有错乱数据问题。 加入pickerview_customTextSize 和 pickerview_textsize 到 xml 中 来控制自定义文字大小 ---------------------华丽丽的分割线-------------------------- PickerView1.x (我已经把1.0.3版本分到v1.x的分支去了,停止维护1.x的分支) 使用gradle 依赖: compile 'com.bigkoo:pickerview:1.0.3' Demo 图片(招行信用卡的“掌上生活”里面条件选择器他们用的就是我这个库,大家可以当实际项目参考) Thanks WheelView androidWheelView
### 回答1: h5pickerview是一个基于H5技术的选择器组件。它可以在移动端的网页中使用,实现选择日期、间、省市区等功能。 h5pickerview的特点有以下几个方面: 1. 轻量级:h5pickerview是一个轻量级的插件,它的体积小,加载速度快,不会占用太多的资源。 2. 灵活可定制:h5pickerview提供了丰富的配置项,可以根据需求自定义选择器的样式和行为。可以选择日期范围、设定初始值等。 3. 跨平台兼容:由于基于H5技术开发,h5pickerview可以兼容多个平台,无论是iOS、Android还是其他系统,都能够正常运行。 4. 使用简单:h5pickerview的使用非常简单,只需要在页面中引入相关的样式文件和脚本文件,然后在需要的地方添加相应的HTML标签即可。 5. 功能丰富:h5pickerview支持选择日期、间、省市区等功能,用户可以方便地进行选择操作,满足不同场景下的需求。 总结来说,h5pickerview是一个方便实用的选择器组件,它能够帮助开发者快速实现选择日期、间等功能,在移动端网页中提供更好的用户体验。无论是在线预约、订单提交还是其他需要选择操作的场景,h5pickerview都能够发挥重要作用。 ### 回答2: h5pickerview 是一种基于H5开发的日期和间选择器。这个选择器可以在移动设备的浏览器中使用,通过H5代码进行调用和使用。 h5pickerview 可以通过HTML5的input标签的type属性来实现,比如可以使用type="date"实现日期的选择,使用type="time"实现间的选择。此外,还可以通过JavaScript进行更加定制化的使用。 h5pickerview 具有简单易用的特点,开发者可以根据自己的需求来配置和使用。通过简单的HTML代码和JavaScript代码,可以轻松地调用和集成到页面中。 h5pickerview 支持多种配置选项,比如可以设置日期的起始和结束范围,可以设置日期和间的格式等等。这样,可以根据具体的需求来自定义选择器的外观和行为。 总的来说,h5pickerview 是一种方便快捷的日期和间选择器,通过H5开发可以在移动设备的浏览器中使用。它具有简单易用、灵活可配置等优点,能够满足开发者的各种需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值