详解iOS-按钮单选与多选逻辑处理

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

一. 单选逻辑处理

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

#define ZLUnselectedColor [UIColor colorWithRed:(241)/255.0 green:(242)/255.0 blue:(243)/255.0 alpha:1.0]
#define ZLSelectedColor [UIColor colorWithRed:(108)/255.0 green:(187)/255.0 blue:(82)/255.0 alpha:1.0]

@interface ZLRadioViewController ()

// 标签数组(按钮文字)
@property (nonatomic, strong) NSArray *markArray;

// 按钮数组
@property (nonatomic, strong) NSMutableArray *btnArray;

// 选中按钮
@property (nonatomic, strong) UIButton *selectedBtn;

@end
#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时,则回显16
  for (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. 创建按钮控件数组和标签字典, 及选中标签数组(数字)和选中标签数组(文字字符串), 为了展示及上传按钮数据使用

#define ZLUnselectedColor [UIColor colorWithRed:(241)/255.0 green:(242)/255.0 blue:(243)/255.0 alpha:1.0]
#define ZLSelectedColor [UIColor colorWithRed:(128)/255.0 green:(177)/255.0 blue:(34)/255.0 alpha:1.0]

@interface ZLMultiselectController ()

// 标签数组
@property (nonatomic, strong) NSArray *markArray;

// 标签字典
@property (nonatomic, strong) NSDictionary *markDict;

// 选中标签数组(数字)
@property (nonatomic, strong) NSMutableArray *selectedMarkArray;

// 选中标签数组(文字字符串)
@property (nonatomic, strong) NSMutableArray *selectedMarkStrArray;

@end
#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);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • IOS开发相册图片多选和删除的功能

    照例先上效果图 本次用的第三方框架做这个,但是需要考虑的地方也比较多,怎么把拍照和相册选取结合.删除照片后添加新照片时候的相册状态等等,所有的改变都是在操作数组.还需考虑图片的压缩上传. 本次用的第三方框架为:QBImagePickerController 按照惯例,上代码,本次代码较多 第一个控制器 .h里没啥代码 #import "RRZShowEditViewController.h" #import "RRZSendShowTextCell.h" #impo

  • iOS 多选删除功能附tableViewTips及单选删除

    一.前言 这次分享并记录一下tableView的多选删除,并额外记录一下单选删除及tableView的设置小技巧. 二.想要实现的效果图如下: 1.先上原图 2.然后编辑图如下: 3.编辑步骤: 点击右上角按钮编辑,界面呈现编辑状态底部删除按钮弹出 选择删除cell项,点击右下角删除可删除 点击右上角,退出编辑状态,底部删除按钮退出界面 三.多选删除核心代码 1.设置允许tableView编辑状态下允许多选 _mainTableView.allowsMultipleSelectionDuring

  • 详解iOS-按钮单选与多选逻辑处理

    我们经常会有多行多列按钮的页面, 这个时候我们通常会选择循环创建按钮, 然后进行按钮单选或者多选的操作! 一. 单选逻辑处理 1. 创建按钮控件数组及标签数组, 并升级当前选中按钮为属性,方便使用 #define ZLUnselectedColor [UIColor colorWithRed:(241)/255.0 green:(242)/255.0 blue:(243)/255.0 alpha:1.0] #define ZLSelectedColor [UIColor colorWithRed

  • 详解iOS按钮暴力点击的便捷解决方案

    iOS点击事件分类 1.程序中大量按钮没有做连续响应的校验,测试人员连续点击出现了很多不必要的问题,所以只能利用运行时特性,进行hook一下.runtime不能大量使用,但是偶尔使用也是很方便的哈哈. 2.设置单个按钮不需要hook 3.多次点击按钮,只执行最后一次点击事件,忽略前面的点击时间 //// UIButton+touch.h // LiqForDoctors #import#define defaultInterval .5 //默认时间间隔 @interface UIButton

  • IOS UITableViewCell详解及按钮点击事件处理实例

    IOS UITableViewCell详解及按钮点击事件处理 今天突然做项目的时候,又遇到处理自定义的UITableViewCell上按钮的点击事件问题.我知道有两种方式,可是突然想不起来之前是怎么做的了,好记性不如烂笔头,还是记录一下吧. 1.第一种方式给Button加上tag值 这里分为两种:一种是直接在原生的UITableViewCell上添加UIButton按钮,然后给UIButton设置tag值,然后在控制器里的方法里通过取数据,做界面跳转等.还是举个例子吧,省的回忆半天. - (UI

  • 详解IOS开发中生成推送的pem文件

    详解IOS开发中生成推送的pem文件 具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action )并点击 App IDs 2. 创建一个不使用通配符的 App ID .通配符 ID 不能用于推送通知服务.例如,  com.itotem.ip

  • 详解iOS自定义UITabBar与布局

    在小编整理过的文章iOS项目基本框架搭建中,我们详细说明了如何对TabBarItem的图片属性以及文字属性进行一些自定义配置.但是,很多时候,我们需要修改TabBarItem的图片和文字属性之外,还需要自定义TabBarItem的位置,这样系统自带的TabBar的样式并不能满足我们的项目需求,所以我们需要对系统的UITabBar进行自定义,以达到我们的项目需求.例如新浪微博App的底部tab的item就无法用自带的TabBarItem进行实现,最中间那个[+]发布微博并不是用来切换tab的,而是

  • 详解IOS如何防止抓包

    目录 抓包原理 防止抓包 一.发起请求之前判断是否存在代理,存在代理就直接返回,请求失败. 二.我们可以在请求配置中清空代理,让请求不走代理 SSL Pinning(AFN+SSL Pinning)推荐 扩展 抓包原理 其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假冒的服务再和我们真正的服务交互,这个代理就是一个中间者 ,我们所有的数据都会通过这个中间者,所以我们的数据就会被抓取.HTTPS 也同样会被这个中间者伪造的证书来获取我们加密的

  • 详解IOS UITableViewCell 的 imageView大小更改

    详解IOS UITableViewCell 的 imageView大小更改 实例代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCell

  • 详解IOS中文件路径判断是文件还是文件夹

    详解IOS中文件路径判断是文件还是文件夹 方法1 + (BOOL)isDirectory:(NSString *)filePath { BOOL isDirectory = NO; [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory]; return isDirectory; } 方法2 + (BOOL)isDirectory:(NSString *)filePath { NSNum

  • 详解IOS串行队列与并行队列进行同步或者异步的实例

    详解IOS串行队列与并行队列进行同步或者异步的实例 IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情况的工作方式. 同步任务,使用GCD dispatch_sync 进行派发任务 - (void)testSync { dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL); dispatch_

  • 详解IOS 单例的两种方式

    详解IOS 单例的两种方式 方法一: #pragma mark - #pragma mark sharedSingleton methods //单例函数 static RtDataModel *sharedSingletonManager = nil; + (RtDataModel *)sharedManager { @synchronized(self) { if (sharedSingletonManager == nil) { sharedSingletonManager = [[sel

随机推荐