概述

循环创建按钮, 进行按钮单选或者多选的操作.

详细

代码下载:http://www.demodashi.com/demo/10712.html

我们经常会有多行多列按钮的页面, 这个时候我们通常会选择循环创建按钮, 然后进行按钮单选或者多选的操作!

一、程序实现

一. 单选逻辑处理

1. 创建按钮控件数组及标签数组, 并升级当前选中按钮为属性,方便使用

// 标签数组(按钮文字)
@property (nonatomic, strong) NSArray *markArray;
// 按钮数组
@property (nonatomic, strong) NSMutableArray *btnArray;
// 选中按钮
@property (nonatomic, strong) UIButton *selectedBtn;

#pragma mark - 懒加载

- (NSArray *)markArray {if (!_markArray) {NSArray *array = [NSArray array];array = @[@"14", @"15", @"16", @"17", @"18"];_markArray = array;}return _markArray;
}
- (NSMutableArray *)btnArray {if (!_btnArray) {NSMutableArray *array = [NSMutableArray array];_btnArray = array;}return _btnArray;
}

2. 创建单选视图, 循环创建按钮, 并回显上次选中值

- (void)setupRadioBtnView {CGFloat UI_View_Width = [UIScreen mainScreen].bounds.size.width;CGFloat marginX = 15;CGFloat top = 100;CGFloat btnH = 30;CGFloat width = (250 - marginX * 4) / 3;// 按钮背景UIView *btnsBgView = [[UIView alloc] initWithFrame:CGRectMake((UI_View_Width - 250) * 0.5, 50, 250, 300)];btnsBgView.backgroundColor = [UIColor whiteColor];[self.view addSubview:btnsBgView];// 循环创建按钮NSInteger maxCol = 3;for (NSInteger i = 0; i < 5; i++) {UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];btn.backgroundColor = ZLUnselectedColor;btn.layer.cornerRadius = 3.0; // 按钮的边框弧度btn.clipsToBounds = YES;btn.titleLabel.font = [UIFont boldSystemFontOfSize:12];[btn setTitleColor:[UIColor colorWithRed:(102)/255.0 green:(102)/255.0 blue:(102)/255.0 alpha:1.0] forState:UIControlStateNormal];[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];[btn addTarget:self action:@selector(chooseMark:) forControlEvents:UIControlEventTouchUpInside];NSInteger col = i % maxCol; //列btn.x = marginX + col * (width + marginX);NSInteger row = i / maxCol; //行btn.y = top + row * (btnH + marginX);btn.width = width;btn.height = btnH;[btn setTitle:self.markArray[i] forState:UIControlStateNormal];[btnsBgView addSubview:btn];btn.tag = i;[self.btnArray addObject:btn];}// 创建完btn后再判断是否能选择(之前是已经选取过的)// 假数据:之前已经上传16时,则回显16for (UIButton *btn in btnsBgView.subviews) {if ([@"16" isEqualToString:btn.titleLabel.text]) {btn.selected = YES;btn.backgroundColor = ZLSelectedColor;break;}}
}

3. 数字按钮单选处理, 根据tag值去判断是否是当前选中按钮

- (void)chooseMark:(UIButton *)sender {NSLog(@"点击了%@", sender.titleLabel.text);self.selectedBtn = sender;sender.selected = !sender.selected;for (NSInteger j = 0; j < [self.btnArray count]; j++) {UIButton *btn = self.btnArray[j] ;if (sender.tag == j) {btn.selected = sender.selected;} else {btn.selected = NO;}btn.backgroundColor = ZLUnselectedColor;}UIButton *btn = self.btnArray[sender.tag];if (btn.selected) {btn.backgroundColor = ZLSelectedColor;} else {btn.backgroundColor = ZLUnselectedColor;}
}

二. 多选逻辑处理

1. 创建按钮控件数组和标签字典, 及选中标签数组(数字)和选中标签数组(文字字符串), 为了展示及上传按钮数据使用

// 标签数组
@property (nonatomic, strong) NSArray *markArray;
// 标签字典
@property (nonatomic, strong) NSDictionary *markDict;
// 选中标签数组(数字)
@property (nonatomic, strong) NSMutableArray *selectedMarkArray;
// 选中标签数组(文字字符串)
@property (nonatomic, strong) NSMutableArray *selectedMarkStrArray;

#pragma mark - 懒加载

- (NSArray *)markArray {if (!_markArray) {NSArray *array = [NSArray array];array = @[@"导购", @"客服", @"家教", @"礼仪", @"主持"];_markArray = array;}return _markArray;
}
// 上传通过文字key取数字value发送数字
- (NSDictionary *)markDict {if (!_markDict) {NSDictionary *dict = [NSDictionary dictionary];dict = @{@"导购" : @"3" ,@"客服" : @"7",@"家教" : @"9",@"礼仪" : @"10",@"主持" : @"11",};_markDict = dict;}return _markDict;
}
- (NSMutableArray *)selectedMarkArray {if (!_selectedMarkArray) {_selectedMarkArray = [NSMutableArray array];}return _selectedMarkArray;
}
- (NSMutableArray *)selectedMarkStrArray {if (!_selectedMarkStrArray) {_selectedMarkStrArray = [NSMutableArray array];}return _selectedMarkStrArray;
}

2.循环创建按钮视图, 循环创建按钮

- (void)setupMultiselectView {CGFloat UI_View_Width = [UIScreen mainScreen].bounds.size.width;CGFloat marginX = 15;CGFloat top = 19;CGFloat btnH = 35;CGFloat marginH = 40;CGFloat height = 130;CGFloat width = (UI_View_Width - marginX * 4) / 3;// 按钮背景UIView *btnsBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 100, UI_View_Width, height)];btnsBgView.backgroundColor = [UIColor whiteColor];[self.view addSubview:btnsBgView];// 循环创建按钮NSInteger maxCol = 3;for (NSInteger i = 0; i < 5; i++) {UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];btn.backgroundColor = ZLUnselectedColor;btn.layer.cornerRadius = 3.0; // 按钮的边框弧度btn.clipsToBounds = YES;btn.titleLabel.font = [UIFont boldSystemFontOfSize:14];[btn setTitleColor:[UIColor colorWithRed:(102)/255.0 green:(102)/255.0 blue:(102)/255.0 alpha:1.0] forState:UIControlStateNormal];[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];[btn addTarget:self action:@selector(chooseMark:) forControlEvents:UIControlEventTouchUpInside];NSInteger col = i % maxCol; //列btn.x  = marginX + col * (width + marginX);NSInteger row = i / maxCol; //行btn.y = top + row * (btnH + marginX);btn.width = width;btn.height = btnH;[btn setTitle:self.markArray[i] forState:UIControlStateNormal];[btnsBgView addSubview:btn];}// 确定按钮UIButton *surebtn = [UIButton buttonWithType:UIButtonTypeCustom];[surebtn setTitle:@"确定" forState:UIControlStateNormal];surebtn.frame = CGRectMake(marginX * 2, CGRectGetMaxY(btnsBgView.frame) + marginH, UI_View_Width - marginX * 4, 40);surebtn.titleLabel.font = [UIFont boldSystemFontOfSize:16];[surebtn addTarget:self action:@selector(sureBtnClick) forControlEvents:UIControlEventTouchUpInside];surebtn.backgroundColor = [UIColor orangeColor];surebtn.layer.cornerRadius = 3.0;surebtn.clipsToBounds = YES;[self.view addSubview:surebtn];
}

3. 按钮多选逻辑处理, 并上传数据请求处理

/*** 按钮多选处理*/
- (void)chooseMark:(UIButton *)btn {btn.selected = !btn.selected;if (btn.isSelected) {btn.backgroundColor = ZLSelectedColor;[self.selectedMarkArray addObject:self.markDict[btn.titleLabel.text]];[self.selectedMarkStrArray addObject:btn.titleLabel.text];} else {btn.backgroundColor = ZLUnselectedColor;[self.selectedMarkArray removeObject:self.markDict[btn.titleLabel.text]];[self.selectedMarkStrArray removeObject:btn.titleLabel.text];}
}
/*** 确认接口请求处理*/
- (void)sureBtnClick {// 用户选择标签后就把值上传, 也要传给服务器下次直接请求回来// 按钮数字标识字符串NSString *numStr = [self.selectedMarkArray componentsJoinedByString:@","];// 按钮文字字符串NSString *str = [self.selectedMarkStrArray componentsJoinedByString:@","];// 测试:拼接请求参数NSLog(@"按钮数字标识字符串:%@", numStr);NSLog(@"按钮文字字符串:%@", str);
}

三. 可选与不可选逻辑处理

当然有时候也有特殊按钮不让选择.

假数据 测试, 逻辑如下

// 不可选按钮for (UIButton *btn in self.btnArray) {if (btn.tag != 0) {  btn.enabled = YES;btn.backgroundColor = [UIColor whiteColor];btn.layer.borderColor = [XHHNavColor CGColor];} else {btn.enabled = NO;btn.backgroundColor =  XHHColor(230, 230, 230);btn.layer.borderColor = [XHHColor(230, 230, 230) CGColor];}}

二、运行效果

1、单选运行

2、多选运行

三、压缩文件截图

界面性问题可以根据自己项目需求调整即可, 具体可参考代码, 项目能够直接运行!

注:本文著作权归作者,由demo大师(http://www.demodashi.com)宣传,拒绝转载,转载需要作者授权

iOS-按钮单选与多选逻辑处理相关推荐

  1. iOS照片单选、多选、上传服务器、缓存、下载展示

    文章目录 概述 具体步骤 1.打开相机相册 2. 选取照片,上传服务器,保存到本地缓存,及展示 3.浏览原图,删除图片 4.从服务器获取图片,本地缓存,缓存过大清空缓存. 概述 图片单选效果图 图片多 ...

  2. android开发 问卷调查案例_「Android问卷调查类型页面及逻辑实现」RadioButton、CheckBox、EditView、单选、多选、输入、...

    Android问卷调查类型页面及逻辑实现,RadioButton,CheckBox,EditView,RadioButton+EditView单选.多选.输入.单选加输入四种状态四种类型 问题简述:A ...

  3. java多选_java单选换多选

    JQuery 常用积累(四)Bootstrap Multiselect 阅读目录 1.JavaBean 方式,在JSP 页面,嵌入java 代码实现 2.后台数据库交互,前台 JavaScript 动 ...

  4. 好用的下拉选框(单选,多选,全选,清空和反选,及个种样式)----个人钟爱

    下拉选框 如需样例和具体效果,请点击下面的连接. 好用的下拉选框(单选,多选,全选,清空和反选,及个种样式) 附件一:layui应用formselect layui.config({base: './ ...

  5. ios 按钮图片充满按钮_iOS有一些非常危险的按钮-UX评论

    ios 按钮图片充满按钮 I recently bought a cool thing off Amazon. It's an adapter for iPhone, making it easy t ...

  6. 代码分析-DataGrid实现自增列、单选、多选

    上一次,我们为这个DataGrid实现了添加.删除.修改.分页.动态修改内容等功能,今天再来分析一下如何为之添加自增列.单选.多选的功能. 首先看一下需要在上次的基础上增加的代码: (1)实现自增列 ...

  7. 单选不生效为什么_单选、复选、switch、tabs、标签别傻傻分不清

    设计师经常在选用单选还是复选.switch开关?不懂怎么用,请看下文. 单选:只能选一项,且必须此选项可见 摘自百度百科 常用用于B端业务,web端常用.一般长这样: 图片摘自网络 iOS和andro ...

  8. 微信小程序实现单选、全选、反选、取消全选功能

    实现效果 源代码 <!-- 循环单选 --><viewclass="parkNotice-email"v-for="(item2, index2) in ...

  9. 数字IC常考题(单选、多选、编程)

    目录 一.单选题 关于跨时钟域电路的设计,以下说法正确的是: 若要将异或非门当作反相器(非门)使用,则输入端A B端的连接方式是() 以下代码综合出来的D触发器的D端逻辑表达式为: FIFO深度:Mo ...

最新文章

  1. Linux—进程管理
  2. 高等数学:第十二章 微分方程(2)一阶线性非齐次微分方程、全微分方程、可降阶的微分方程
  3. HTML5 file api读取文件的MD5码工具
  4. rfm模型分析与客户细分_如何使用基于RFM的细分来确定最佳客户
  5. 你的飞碟在这儿(洛谷-P1200 )
  6. tensorflow单变量线性回归
  7. 关于XML序列化与CultureInfo
  8. Apache Shiro SessionManager配置详解.
  9. Unieap3.5-Grid翻页不提示修改
  10. 转:在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法...
  11. python包安装-centos7/windows
  12. 酒店管理系统-可行性研究报告
  13. UT000054: The maximum size 1048576 for an individual file in a multipart req
  14. Git学习:来自fengyu的b站听课笔记
  15. TzT233的大盘鸡(未完成)
  16. 清华管理评论 | 上奇数科:产业知识服务引擎开创者
  17. n行Python代码系列:五行代码实现两个视频画中画播放
  18. [YOLOv7/YOLOv5系列算法改进NO.20]Involution新神经网络算子引入网络
  19. python 破解字体加密实战
  20. 图像恢复(加噪与去噪)

热门文章

  1. endp 汇编start_常见汇编代码
  2. 用winformz时间格式不正确_霜冻不可怕,用生态防寒布正确预防减少损失
  3. 公务员计算机软件及相关专业,公务员计算机专业考试大纲和真题3
  4. 【声学基础】概述——振动学
  5. 串口发送和接受字符串,AD转换多通道读取
  6. java中jnum i .length,java数组和多维数组
  7. 使用Java泛型和反射机制编写Excel文件生成和解析的通用工具类
  8. docker镜像编码注意事项
  9. Jenkins系列之-—07 集成JIRA
  10. 企业级Ngnix基于域名的配置_server