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

  • 最近需要做一个统一的单选、多选组件,需要做一些逻辑判断。
  • 由于某些原因,不能测试逻辑的实现代码。因此写了流程图并写完逻辑之后写下了详细的注释,方便可以测试的时候可以迅速定位问题。
  • 今天测试了一下,逻辑正确,因此将流程图和逻辑代码贴上来。

流程图

单选:多选逻辑.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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容