agiapp / BRPickerView

BRPickerView 封装的是iOS中常用的选择器组件,主要包括:日期选择器(支持年月日、年月等15种日期样式选择,支持设置星期、至今等)、地址选择器(支持省市区、省市、省三种地区选择)、自定义字符串选择器(支持单列、多列、二级联动、三级联动选择)。支持自定义主题样式,适配深色模式,支持将选择器组件添加到指定容器视图。
https://github.com/agiapp/BRPickerView
MIT License
2.57k stars 446 forks source link

联动数据配置问题 #163

Closed newbiebie closed 4 years ago

newbiebie commented 4 years ago

多列联动数据源配置之后不显示,内存暴增, 只添加第一列数据正常显示,第二列数据添加进之后错误

agiapp commented 4 years ago

参考Demo进行使用,要注意数据源的格式

newbiebie commented 4 years ago

看过demo, 联动的关系决定于parentKey, 只要把数据源填充到一个一维数组, 顺序应该没有什么关系吧, 本地json文件是数组嵌套数组的格式, 我把每一级的数据逐次添加,parentKey 也做对照了, 依然显示不出来。 填充模型的各属性值和demo中输出的也没差别。

agiapp commented 4 years ago

方便贴一下你调用的代码和部分数据源格式吗,我排查一下

newbiebie commented 4 years ago
屏幕快照 2020-08-04 上午10 47 49 屏幕快照 2020-08-04 上午10 48 02 屏幕快照 2020-08-04 上午10 49 23
newbiebie commented 4 years ago

中间第二张图片是demo中的方法, 我也截图出来了, 第三张是本地json 数据。

agiapp commented 4 years ago

找到原因了,数据源 key(GradeID) 不能出现和 parent_key(StageID) 相等的情况,不然在遍历数组的时候会出现死循环。 如:下面的数据源是可以的

{
  "Code": 1,
  "Message": "获取数据成功!",
  "GetStageInfoDto": [
      {
          "GetGradeInfoDto": [
              {
                  "GradeID": "11",
                  "Name": "一年级",
                  "StageID": "1"
              },
              {
                  "GradeID": "12",
                  "Name": "二年级",
                  "StageID": "1"
              },
              {
                  "GradeID": "13",
                  "Name": "三年级",
                  "StageID": "1"
              },
              {
                  "GradeID": "14",
                  "Name": "四年级",
                  "StageID": "1"
              },
              {
                  "GradeID": "15",
                  "Name": "五年级",
                  "StageID": "1"
              },
              {
                  "GradeID": "16",
                  "Name": "六年级",
                  "StageID": "1"
              }
          ],
          "Name": "小学",
          "StageID": "1"
      },
      {
          "GetGradeInfoDto": [
              {
                  "GradeID": "21",
                  "Name": "初一",
                  "StageID": "2"
              },
              {
                  "GradeID": "22",
                  "Name": "初二",
                  "StageID": "2"
              },
              {
                  "GradeID": "23",
                  "Name": "初三",
                  "StageID": "2"
              }
          ],
          "Name": "初中",
          "StageID": "2"
      },
      {
          "GetGradeInfoDto": [
              {
                  "GradeID": "31",
                  "Name": "高一",
                  "StageID": "3"
              },
              {
                  "GradeID": "32",
                  "Name": "高二",
                  "StageID": "3"
              },
              {
                  "GradeID": "33",
                  "Name": "高三",
                  "StageID": "3"
              }
          ],
          "Name": "高中",
          "StageID": "3"
      }
  ]
}
newbiebie commented 4 years ago

可以了, 感谢! 但是发现一个新问题,stringPickerView.pickerMode = BRStringPickerComponentLinkage;多级联动的时候,设置stringPickerView.isAutoSelect = NO; 点击确定按钮回调无响应

newbiebie commented 4 years ago
屏幕快照 2020-08-04 下午3 58 16
agiapp commented 4 years ago

多谢提醒,下个版本会更新

    @weakify(self)
    self.doneBlock = ^{
        @strongify(self)
        // 点击确定按钮后,执行block回调
        [self removePickerFromView:view];

        if (self.pickerMode == BRStringPickerComponentSingle) {
            if (self.resultModelBlock) {
                self.resultModelBlock([self getResultModel]);
            }
        } else if (self.pickerMode == BRStringPickerComponentMulti || self.pickerMode == BRStringPickerComponentLinkage) {
            if (self.resultModelArrayBlock) {
                self.resultModelArrayBlock([self getResultModelArr]);
            }
        }
    };
agiapp commented 4 years ago

已更新,联动选择器新增了如下属性:

/**
 *  最大层级数(列数) for `BRStringPickerComponentLinkage`, ignored otherwise.
 *  使用场景:默认可选,当数据源中有 key 等于 parentKey 情况时,必须要设置
 */
@property (nonatomic, assign) NSInteger numberOfComponents;

可以有效解决数据源中有 key 等于 parentKey 情况时,出现的死循环问题。