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# 基于委托的事件
事件基于多播委托的特性. 多播委托事实上就是一组类型安全的函数指针管理器,调用则执行顺序跳转到数组里所有的函数指针里执行. class Program { public class CarInfoEv ...
- 浅谈iOS视频播放的N种解决方案
简 注册登录 添加关注 作者 Maru2016.03.22 20:46* 写了4349字,被135人关注,获得了207个喜欢 字数1621 阅读2895 评论43 喜欢159 header ...
- Matlab 符号运算
root(p):多项式求根.多项式等于0时对应方程的根. 例:,则输入p=[5 4 3 2 1]; root(p) 注:多项式系数都是按幂指数递减形式的. poly([a,b,c]):求已知根为a,b ...
- 复位应答ATR的基本结构和数据元
根据定义,复位应答是一系列字节的值,这些字节是由卡作为对复位命令的响应发送给接口设备的 ,在I/O电路上,每个字节在一个异步字符中传输.每个成功的复位操作,都会导致I/O上的一个初始字符TS,TS后面 ...
- HID燈是什么及其工作原理
HID為HighIntensityDischarge的縮寫,即高壓氣體放電燈,它發光的原理是將12V電壓增壓至23000V的超高電壓,激穿填充在石英管的氙氣,使它發光.然后再將電壓轉成85V左右,穩定 ...
- 高效率使用google
Google良好的搜索和易用性已经得到了广大网友的欢迎,但是除了我们经常使用的Google网站.图像和新闻搜索之外,它还有很多其他搜索功能和搜索技巧.如果我们也能充分利用,必将带来更大的便利.这里我介 ...
- 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错
原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...
- Clone Graph——LeetCode
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- 2014-08-22 关于Response、Request等对象在cs文件中的使用
今天是在吾索实习的第33天.已经有一段时间没写过博客了,今天突然想起个值得分享的东西,所以又华丽地回归了. 废话不多说了,直奔主题.我们会发现,在我们在cs文件中,直接使用Response.Reque ...
- 你不知道的关于计算机大师 Dijkstra 的事情
Dijkstra 的全名叫 Edsger Wybe Dijkstra(艾兹赫尔·韦伯·戴克斯特拉).大部分中国程序员如果能记住这个名字是因为学过计算最短路径的「Dijkstra 算法」,然而大部分人都 ...