UITableView实现分组, 并且点击每个分组后展开
效果图:
简单说下实现思路:
数据传过来之后, 先创建好对应个数的分组头部View, 也就是要在
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
在这个方法返回的视图...我这里用的UIButton, 然后监听UIButton的点击, 然后重新刷新这一组
根据UIButton的selected状态来判断是否要展开, 如果是展开, 就返回该组对应的行数, 反之就返回0行就可以了
代码部分:
.h文件
- #import <UIKit/UIKit.h>
- @interface RPCategoryListController : UITableViewController
- // 分组模型数据
- @property (nonatomic, strong) NSArray *category;
- @end
.m文件
- #import "RPCategoryListController.h"
- #import "RPCategoryModel.h"
- #import "RPChildCategoryModel.h"
- #define RPSectionTitleHeight 35
- @interface RPCategoryListController ()
- @property (nonatomic, strong) NSMutableArray *sectionTitleBtns;
- @end
- @implementation RPCategoryListController
- static NSString * const reuseIdentifier_category = @"Category";
- #pragma mark - 懒加载
- - (NSMutableArray *)sectionTitleBtns
- {
- if (!_sectionTitleBtns) {
- _sectionTitleBtns = [[NSMutableArray alloc] init];
- }
- return _sectionTitleBtns;
- }
- #pragma mark - 系统方法
- - (instancetype)init
- {
- return [super initWithStyle:UITableViewStyleGrouped];
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:reuseIdentifier_category];
- }
- #pragma mark - Table view data source
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return self.category.count;
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- UIButton *sectionTitleBtn;
- // 获取被点击的组标题按钮
- for (UIButton *btn in self.sectionTitleBtns) {
- if (btn.tag == section) {
- sectionTitleBtn = btn;
- break;
- }
- }
- // 判断是否展开
- if (sectionTitleBtn.isSelected) {
- RPCategoryModel *categoryModel = self.category[section];
- return categoryModel.childs.count;
- }
- return ;
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- RPChildCategoryModel *childCategoryModel = [self.category[indexPath.section] childs][indexPath.row];
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier_category forIndexPath:indexPath];
- cell.textLabel.textColor = RPFontColor;
- if ([[RPInternationalControl userLanguage] isEqualToString:@"en"]) {
- cell.textLabel.text = childCategoryModel.ename;
- } else {
- cell.textLabel.text = childCategoryModel.name;
- }
- return cell;
- }
- - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
- {
- return self.sectionTitleBtns[section];
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
- {
- return RPSectionTitleHeight;
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
- {
- return ;
- }
- #pragma mark - 私有方法
- - (void)sectionTitleBtnClick:(UIButton *)sectionTitleBtn
- {
- // 修改组标题按钮的状态
- sectionTitleBtn.selected = !sectionTitleBtn.isSelected;
- // 刷新单独一组
- NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:sectionTitleBtn.tag];
- [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
- }
- - (void)setCategory:(NSArray *)category
- {
- _category = category;
- for (int index = ; index < category.count; index++) {
- // 组标题按钮的标题
- NSString *title = self.category[index] name;
- // 创建组标题按钮
- UIButton *sectionTitleBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- sectionTitleBtn.frame = CGRectMake(, , RP_SCREEN_WIDTH, RPSectionTitleHeight);
- sectionTitleBtn.tag = index;
- sectionTitleBtn.titleLabel.font = [UIFont systemFontOfSize:.f];
- [sectionTitleBtn setTitle:title forState:UIControlStateNormal];
- [sectionTitleBtn setTitleColor:RPFontColor forState:UIControlStateNormal];
- [sectionTitleBtn setBackgroundColor:[UIColor whiteColor]];
- [sectionTitleBtn addTarget:self action:@selector(sectionTitleBtnClick:) forControlEvents:UIControlEventTouchUpInside];
- [self.sectionTitleBtns addObject:sectionTitleBtn];
- // 组标题按钮底部分隔线
- UIView *bottomLine = [[UIView alloc] initWithFrame:CGRectMake(, sectionTitleBtn.height - , sectionTitleBtn.width, )];
- bottomLine.backgroundColor = RPNavBarColor;
- bottomLine.alpha = 0.2;
- [sectionTitleBtn addSubview:bottomLine];
- }
- }
关键代码:
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:sectionTitleBtn.tag];
[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
UITableView实现分组, 并且点击每个分组后展开的更多相关文章
- 微信分组群发45028,微信分组群发has no masssend quota hint
微信分组群发45028,微信分组群发has no masssend quota hint >>>>>>>>>>>>>> ...
- Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异
转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...
- Jquery插件实现点击获取验证码后60秒内禁止重新获取
通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能 先到官网(http://plugins.jquery.com/cookie/ )下载coo ...
- VS2010 使用时选择代码或双击时出错,点击窗口按钮后VS自动重启问题
VS2010 使用时选择代码或双击时出错崩溃,点击窗口按钮后VS自动重启问题 下载补丁,打上补丁之后,重启电脑,解决了问题. WindowsXP的下载地址:Windows XP 更新程序 (KB971 ...
- android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序
android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序 在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity ...
- MonkeyRunner 实现自动点击截屏后与本地图库进行对比输出
先说下本人是菜鸟,通过网上资料学习,终于调通了MonkeyRunner 实现自动点击截屏后与本地图库进行对比输出,以后做静态UI测试就不需要眼睛盯着看图了,这一切交给MonkeyRunner了. 首先 ...
- layui表格点击排序按钮后,表格绑定事件失效解决方法
最近项目使用layui较为频繁,遇到了一个麻烦的问题,网上搜索也没有看到同类型的问题,故此记下来. 需求是点击上图右侧表格中某一个单元格,会触发点击事件如下代码: $("table>t ...
- 点击<a>标签后禁止页面跳至顶部
一.点击<a>标签后禁止页面跳至顶部 1. 使用 href="javascript:void(0);",例如: <a href="javascript: ...
- php中点击下载按钮后待下载文件被清空
在php中设置了文件下载,下载按钮使用表单的方式来提交 <form method="post" class="form-inline" role=&quo ...
随机推荐
- 在C#中使用属性控件添加属性窗口
转自原文 在C#中使用属性控件添加属性窗口 第一步,创建在应用程序中将要展现的字段属性为public公有属性.其中,所有的属性必须有get和set的方法(如果不设置get方法,则要显示的属性不会显示在 ...
- poj Organize Your Train part II
http://poj.org/problem?id=3007 #include<cstdio> #include<algorithm> #include<cstring& ...
- 使用MFC开发有十多年了,结合自身的体会,随便说几句(不能样样都依赖别人,C体系的人,绝对不怕人踢馆)
挺长时间了吧,这个帖子还没沉下去,使用MFC开发有十多年了,结合自身的体会,随便说几句:1.MFC是一个C++的基础类库,封装了绝大多数的API函数,主要是用来创建带UI的应用程序,服务端程序或着不带 ...
- OI经典语录
1.没有dp的日子仿佛饭菜没放盐,没有树巨结垢的日子仿佛口袋没有钱. 2.算法努力,AC随缘. 3.人生就像OI啊真是又WA又T...---J
- (转载)偏序集的Dilworth定理学习
导弹拦截是一个经典问题:求一个序列的最长不上升子序列,以及求能最少划分成几组不上升子序列.第一问是经典动态规划,第二问直接的方法是最小路径覆盖, 但是二分图匹配的复杂度较高,我们可以将其转化成求最长上 ...
- POJ 1511 SPFA+邻接表 Invitation Cards
题目大意: 计算从 1 点 到 其他所有点的 往返距离之和, 因为是 有向图, 所以我们需要将图反存 一次, 然后求两次单源最短路, 结果就出来了. #include <iostream> ...
- 调试makefile—subst函数
操作系统:ubuntu10.04 Makefile里的subst用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO Makefile中的字符串处理函数格式: ...
- 2014-08-26 解决HttpContext.Current.Session在ashx文件中出现“未将对象引用设置到对象的实例”的问题
今天是在吾索实习的第35天. 最近在使用HttpContext.Current.Session来获取Session["..."]的值时,常常会弹出错误——“未将对象引用设置到对象的 ...
- in, out, ref
C#中的函数传递方式可以为in.out.ref(引用) in方式的是默认的传递方式,即向函数内部传送值,不作讲解 很多语言都有类似的操作从函数向调用者返回值,这样我们可以通过函数的调用返回多个值,因为 ...
- node.js环境配置(angularjs高级程序设计中出现的错误)
一:npm install connect会出现错误:解决方法 1:$ npm install connect@2.X.X 2:$ npm install serve-static: 建立server ...