美文网首页
单选/多选投票的逻辑实现

单选/多选投票的逻辑实现

作者: Jerry_Lee | 来源:发表于2016-10-14 17:38 被阅读220次
  • 最近需要做一个统一的单选、多选组件,需要做一些逻辑判断。
  • 由于某些原因,不能测试逻辑的实现代码。因此写了流程图并写完逻辑之后写下了详细的注释,方便可以测试的时候可以迅速定位问题。
  • 今天测试了一下,逻辑正确,因此将流程图和逻辑代码贴上来。

流程图

单选:多选逻辑.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。

相关文章

网友评论

      本文标题:单选/多选投票的逻辑实现

      本文链接:https://www.haomeiwen.com/subject/wlfnyttx.html