Skip to content

Commit

Permalink
fix #163
Browse files Browse the repository at this point in the history
  • Loading branch information
agiapp committed Aug 5, 2020
1 parent 0482d99 commit 24d0339
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 6 deletions.
6 changes: 6 additions & 0 deletions BRPickerView/StringPickerView/BRStringPickerView.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ typedef void(^BRStringResultModelArrayBlock)(NSArray <BRResultModel *> * _Nullab
/** 滚动选择时触发的回调【多列】 */
@property (nullable, nonatomic, copy) BRStringResultModelArrayBlock changeModelArrayBlock;

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

/// 初始化字符串选择器
/// @param pickerMode 字符串选择器显示类型
- (instancetype)initWithPickerMode:(BRStringPickerMode)pickerMode;
Expand Down
39 changes: 33 additions & 6 deletions BRPickerView/StringPickerView/BRStringPickerView.m
Original file line number Diff line number Diff line change
Expand Up @@ -194,9 +194,13 @@ - (void)handlerPickerData {
BRResultModel *selectModel = nil;
BOOL hasNext = YES;
NSInteger i = 0;

NSMutableArray *dataArr = [self.dataSourceArr mutableCopy];

do {
NSArray *nextArr = [self getNextDataArr:self.dataSourceArr selectModel:selectModel];
if (nextArr.count == 0) {
NSArray *nextArr = [self getNextDataArr:dataArr selectModel:selectModel];
// 设置默认最大层级为三级,防止 key 等于 parentKey 时,进入死循环
if (nextArr.count == 0 || i > self.maxLevel - 1) {
hasNext = NO;
break;
}
Expand All @@ -209,7 +213,23 @@ - (void)handlerPickerData {

[selectIndexs addObject:@(selectIndex)];
[mDataSourceArr addObject:nextArr];

/*
// 过滤数据源,防止出现死循环(key等于parentKey时);这种方式比较影响性能,改用使用 maxLevel
for (BRResultModel *model in nextArr) {
if (![model isEqual:selectModel]) {
NSMutableArray *tmpArr = [dataArr mutableCopy];
for (BRResultModel *tmpModel in dataArr) {
if ([model.key isEqualToString:tmpModel.parentKey]) {
[tmpArr removeObject:tmpModel];
}
}
dataArr = [tmpArr mutableCopy];
// NSPredicate *pred = [NSPredicate predicateWithFormat:@"NOT SELF.parentKey IN %@.key", model];
// [dataArr filterUsingPredicate:pred];
}
[dataArr removeObject:model];
}
*/
i++;

} while (hasNext);
Expand All @@ -221,9 +241,9 @@ - (void)handlerPickerData {

- (NSArray <BRResultModel *>*)getNextDataArr:(NSArray *)dataArr selectModel:(BRResultModel *)selectModel {
NSMutableArray *tempArr = [[NSMutableArray alloc]init];
// parentKey = @"-1",表示是第一列数据
NSString *key = selectModel ? selectModel.key : @"-1";
for (BRResultModel *model in dataArr) {
// parentKey = @"-1",表示是第一列数据
NSString *key = selectModel ? selectModel.key : @"-1";
if ([model.parentKey isEqualToString:key]) {
[tempArr addObject:model];
}
Expand Down Expand Up @@ -556,7 +576,7 @@ - (void)addPickerToView:(UIView *)view {
if (self.resultModelBlock) {
self.resultModelBlock([self getResultModel]);
}
} else if (self.pickerMode == BRStringPickerComponentMulti) {
} else if (self.pickerMode == BRStringPickerComponentMulti || self.pickerMode == BRStringPickerComponentLinkage) {
if (self.resultModelArrayBlock) {
self.resultModelArrayBlock([self getResultModelArr]);
}
Expand Down Expand Up @@ -619,4 +639,11 @@ - (NSArray *)mDataSourceArr {
return _mSelectValues;
}

- (NSInteger)maxLevel {
if (_maxLevel <= 0) {
_maxLevel = 3;
}
return _maxLevel;
}

@end

0 comments on commit 24d0339

Please sign in to comment.