欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-13 19:20:10
我们经常会有多行多列按钮的页面, 这个时候我们通常会选择循环创建按钮, 然后进行按钮单选或者多选的操作! 一. 单选逻辑处理 1. 创建按钮控件数组及标签数组, 并...

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

一. 单选逻辑处理

详解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;
  }
}

二. 多选逻辑处理

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

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);
}

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