iOS-按钮单选与多选逻辑处理
概述
详细
代码下载: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-按钮单选与多选逻辑处理相关推荐
- iOS照片单选、多选、上传服务器、缓存、下载展示
文章目录 概述 具体步骤 1.打开相机相册 2. 选取照片,上传服务器,保存到本地缓存,及展示 3.浏览原图,删除图片 4.从服务器获取图片,本地缓存,缓存过大清空缓存. 概述 图片单选效果图 图片多 ...
- android开发 问卷调查案例_「Android问卷调查类型页面及逻辑实现」RadioButton、CheckBox、EditView、单选、多选、输入、...
Android问卷调查类型页面及逻辑实现,RadioButton,CheckBox,EditView,RadioButton+EditView单选.多选.输入.单选加输入四种状态四种类型 问题简述:A ...
- java多选_java单选换多选
JQuery 常用积累(四)Bootstrap Multiselect 阅读目录 1.JavaBean 方式,在JSP 页面,嵌入java 代码实现 2.后台数据库交互,前台 JavaScript 动 ...
- 好用的下拉选框(单选,多选,全选,清空和反选,及个种样式)----个人钟爱
下拉选框 如需样例和具体效果,请点击下面的连接. 好用的下拉选框(单选,多选,全选,清空和反选,及个种样式) 附件一:layui应用formselect layui.config({base: './ ...
- ios 按钮图片充满按钮_iOS有一些非常危险的按钮-UX评论
ios 按钮图片充满按钮 I recently bought a cool thing off Amazon. It's an adapter for iPhone, making it easy t ...
- 代码分析-DataGrid实现自增列、单选、多选
上一次,我们为这个DataGrid实现了添加.删除.修改.分页.动态修改内容等功能,今天再来分析一下如何为之添加自增列.单选.多选的功能. 首先看一下需要在上次的基础上增加的代码: (1)实现自增列 ...
- 单选不生效为什么_单选、复选、switch、tabs、标签别傻傻分不清
设计师经常在选用单选还是复选.switch开关?不懂怎么用,请看下文. 单选:只能选一项,且必须此选项可见 摘自百度百科 常用用于B端业务,web端常用.一般长这样: 图片摘自网络 iOS和andro ...
- 微信小程序实现单选、全选、反选、取消全选功能
实现效果 源代码 <!-- 循环单选 --><viewclass="parkNotice-email"v-for="(item2, index2) in ...
- 数字IC常考题(单选、多选、编程)
目录 一.单选题 关于跨时钟域电路的设计,以下说法正确的是: 若要将异或非门当作反相器(非门)使用,则输入端A B端的连接方式是() 以下代码综合出来的D触发器的D端逻辑表达式为: FIFO深度:Mo ...
最新文章
- Linux—进程管理
- 高等数学:第十二章 微分方程(2)一阶线性非齐次微分方程、全微分方程、可降阶的微分方程
- HTML5 file api读取文件的MD5码工具
- rfm模型分析与客户细分_如何使用基于RFM的细分来确定最佳客户
- 你的飞碟在这儿(洛谷-P1200 )
- tensorflow单变量线性回归
- 关于XML序列化与CultureInfo
- Apache Shiro SessionManager配置详解.
- Unieap3.5-Grid翻页不提示修改
- 转:在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法...
- python包安装-centos7/windows
- 酒店管理系统-可行性研究报告
- UT000054: The maximum size 1048576 for an individual file in a multipart req
- Git学习:来自fengyu的b站听课笔记
- TzT233的大盘鸡(未完成)
- 清华管理评论 | 上奇数科:产业知识服务引擎开创者
- n行Python代码系列:五行代码实现两个视频画中画播放
- [YOLOv7/YOLOv5系列算法改进NO.20]Involution新神经网络算子引入网络
- python 破解字体加密实战
- 图像恢复(加噪与去噪)