- 最近需要做一个统一的单选、多选组件,需要做一些逻辑判断。
- 由于某些原因,不能测试逻辑的实现代码。因此写了流程图并写完逻辑之后写下了详细的注释,方便可以测试的时候可以迅速定位问题。
- 今天测试了一下,逻辑正确,因此将流程图和逻辑代码贴上来。
流程图
单选:多选逻辑.png
逻辑代码
// 找到被点击按钮的序号
NSInteger buttonIndex = -1;
for (NSInteger i=0; i<[_showButtons count]; i++) {
UIButton *showButton = [_showButtons objectAtIndex:i];
if (showButton == sender) {
buttonIndex = i;
break;
}
}
if (!_indexs) {
_indexs = [NSMutableArray array];
}
if (sender.selected) { // 已点击过该选项
if (_multi) { // 多选,取消选中
sender.selected = NO;
if (buttonIndex != -1) {
[_indexs removeObject:@(buttonIndex)];
}
}
} else { // 未点击过该选项
if (_multi) { // 多选
if (_multiMax == [_indexs count]) { // 达到选择上限
// TODO: - 无反应 或者提示达到选择上限
} else { // 未达到选择上限,选中该选项
sender.selected = YES;
if (buttonIndex != -1) {
[_indexs addObject:@(buttonIndex)];
}
}
} else { // 单选
if ([_indexs count] == 0) { // 未点击过其他选项
sender.selected = YES;
if (buttonIndex != -1) {
[_indexs addObject:@(buttonIndex)];
}
} else { // 点击过其他选项,取消其他选项,选中该选项
for (UIButton *showButton in _showButtons) {
showButton.selected = NO;
}
[_indexs removeAllObjects];
sender.selected = YES;
if (buttonIndex != -1) {
[_indexs addObject:@(buttonIndex)];
}
}
}
}
代码中一些字段的解释
- _multi 是一个bool值,用于判断是否为多选,YES为多选。
- _multiMax 是一个NSInteger,为多选的允许选择的上限。比如说有8个选项,最多可选4个,那么_multiMax为4。
网友评论