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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值