热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

iOStableView实现单选和多选的实例代码

今天在项目中遇到了tableView的单选需求,现在总结一下,用一个简单的demo实现了简单的单选和多选两个功能.先看下效果图:

今天在项目中遇到了tableView的单选需求,现在总结一下,用一个简单的demo实现了简单的单选和多选两个功能.先看下效果图:


1:首先实现下单选

1:使用一个变量记录选中的行

@property (assign, nonatomic) NSIndexPath    *selIndex;   //单选选中的行

2:设置tableView数据,共2组,每组10行,

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  return 10;
}

3:实现tableView的点击方法,每次点击记录点击的索引,取消之前的选择行,将当前选择的行打钩

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    //取消之前的选择
    UITableViewCell *celled = [tableView cellForRowAtIndexPath:_selIndex];
    celled.accessoryType = UITableViewCellAccessoryNone;

    //记录当前的选择的位置
    _selIndex = indexPath;

    //当前选择的打钩
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}

4:列表滚动时,判断是否为选中的行,如果是cell是选中的那一行,就设置cell的accessoryType为UITableViewCellAccessoryCheckmark,到这里单选就实现完成了

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  static NSString *cellid = @"cellid";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid];
  if (cell == nil) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellid];
  }
  cell.textLabel.text = [NSString stringWithFormat:@"第%zi组,第%zi行",indexPath.section+1,indexPath.row];

  if (_selIndex == indexPath) {
     cell.accessoryType = UITableViewCellAccessoryCheckmark;
  }else{
     cell.accessoryType = UITableViewCellAccessoryNone;
  }
  return cell;
}

2:下面实现多选

1:使用一个数组记录选中的行

@property (strong, nonatomic) NSMutableArray  *selectIndexs; //多选选中的行

2:使用一个变量判断是单选还是多选状态

@property (nonatomic, assign) BOOL       isSingle;    //单选还是多选

3:导航栏右侧按钮设置为单选和双选的切换按钮,并初始化多选记录数组

UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithTitle:@"多选" style:UIBarButtonItemStylePlain target:self action:@selector(singleSelect)];
  self.navigationItem.rightBarButtOnItem= rightItem;

  //初始化多选数组
  _selectIndexs = [NSMutableArray new];

4:点击导航栏上的切换按钮切换单选还是多选状态

//单选还是多选按钮点击事件
-(void)singleSelect{
  _isSingle = !_isSingle;
  if (_isSingle) {
    self.navigationItem.rightBarButtonItem.title = @"多选";
    self.title = @"(单选)";
    //切换为单选的时候,清除多选数组,重新加载列表
    [self.selectIndexs removeAllObjects];
    [self.tableView reloadData];
  }else{
    self.title = @"(多选)";
    self.navigationItem.rightBarButtonItem.title = @"单选";
  }
}

5:为tableView的点击方法中加上单选还是多选的状态判断,多选的话,将点击的行加入到多选索引数组中去,然后改变该行的cell.accessoryType,重复点击就做反操作

//选中某一行
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

  if (_isSingle) {    //单选
    //取消之前的选择
    UITableViewCell *celled = [tableView cellForRowAtIndexPath:_selIndex];
    celled.accessoryType = UITableViewCellAccessoryNone;

    //记录当前的选择的位置
    _selIndex = indexPath;

    //当前选择的打钩
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;

  }else{           //多选
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { //如果为选中状态
      cell.accessoryType = UITableViewCellAccessoryNone; //切换为未选中
      [_selectIndexs removeObject:indexPath]; //数据移除
    }else { //未选中
      cell.accessoryType = UITableViewCellAccessoryCheckmark; //切换为选中
      [_selectIndexs addObject:indexPath]; //添加索引数据到数组
    }
  }
}

6:在cellForRow代理方法中同样加入单选多选的判断,在滚动列表是加载列表,判断是否选中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  static NSString *cellid = @"cellid";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid];
  if (cell == nil) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellid];
  }
  cell.textLabel.text = [NSString stringWithFormat:@"第%zi组,第%zi行",indexPath.section+1,indexPath.row];

  if (_isSingle) {      //单选
    if (_selIndex == indexPath) {
      cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
      cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
  }else{           //多选
    cell.accessoryType = UIAccessibilityTraitNone;
    for (NSIndexPath *index in _selectIndexs) {
      if (indexPath == index) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
      }
    }
  }
  return cell;
}

到这里就完成了,没什么技术含量,有需求的可以参考下,有好的想法可以多多交流,项目在github的地址.

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


推荐阅读
  • 基于 NCNN 框架的 PelleeNet_SSD 实现,适用于嵌入式和移动设备的高效目标检测。 ... [详细]
  • 对 manual_async_fn 进行了改进,确保其能够正确处理和捕获输入的生命周期。 ... [详细]
  • MySQL中的Anemometer使用指南
    本文详细介绍了如何在MySQL环境中部署和使用Anemometer,以帮助开发者有效监控和优化慢查询性能。通过本文,您将了解从环境准备到具体配置的全过程。 ... [详细]
  • 在使用gitpod.io进行开发时,遇到了因缓存机制缺失而导致Carrierwave::Cloudinary无法正常加载图片的问题。本文将探讨如何有效解决这一技术难题。 ... [详细]
  • 在CentOS 7上轻松安装Elasticsearch的JDBC插件
    本文介绍如何在CentOS 7操作系统中安装Elasticsearch (简称ES) 的JDBC插件,以实现与MySQL数据库的有效连接,特别强调了该方法对于增量数据同步的支持。 ... [详细]
  • 最近在深入学习《数据结构与算法–JavaScript描述》一书,尝试通过npmjs.org寻找合适的库作为参考,但未能找到完全符合需求的资源。因此,决定自行实现一个字典数据结构,以便日后能够直接应用。 ... [详细]
  • 本文详细介绍了Java中net.spy.memcached.transcoders.WhalinV1Transcoder类的deserialize()方法,并提供了多个实际代码示例,帮助开发者更好地理解和应用此方法。 ... [详细]
  • 近期,公司在构建新的交易系统时遇到了一个常见的问题——金额存储。由于涉及资金的操作需要高度的准确性,使用float类型进行金额计算可能会导致不可预见的误差。本文将深入探讨这一问题,并提供解决方案。 ... [详细]
  • 假设您当前位于主分支(版本C4),但发现某些功能已损坏,而这些功能在之前的版本C1时还能正常工作。如何将从C1到C4的所有提交复制到一个新的特性分支中,同时将主分支回滚至C1,以便能够安全地进行版本控制和持续集成部署? ... [详细]
  • 本文深入探讨了在Java编程语言中,如何使用`org.apache.polygene.api.association.AssociationDescriptor.qualifiedName()`方法,并提供了多个实际应用的代码示例。这些示例源自GitHub、StackOverflow和Maven等知名平台,旨在帮助开发者更好地理解和应用这一方法。 ... [详细]
  • 本文详细介绍了Java中io.rsocket.RSocket类的dispose()方法,并提供了多个实际应用中的代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Python学习笔记:使用MyQR库创建动态彩色二维码
    本文介绍了如何利用Python的MyQR库来生成动态彩色二维码,包括库的安装方法、基本使用案例以及参数详解,特别针对动态图生成速度过快的问题提供了解决方案。 ... [详细]
  • 如何创建个性化Ubuntu Live CD
    随着Ubuntu频繁的版本更新,越来越多的用户开始探索创建个性化Ubuntu Live CD的方法。这不仅能满足特定的硬件和软件需求,还能极大地提升用户体验。本文将详细介绍使用Distroshare Ubuntu Imager创建定制化Ubuntu Live CD的过程。 ... [详细]
  • Working with Errors in Go 1.13
    作者|陌无崖 ... [详细]
  • 本文档详细介绍了在 CentOS Linux 7.9 系统环境下,如何从源代码编译安装 libwebsockets 库及其示例程序,并提供了编译过程中可能遇到的问题及解决方案。 ... [详细]
author-avatar
康师傅摸-你丶擦_489
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有