解决方法没有捷径,只能在代理方法中,需要用到“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