关于点击TableviewCell的子内容收放问题,拿到它的第一个思路就是,

方法一:

运用UITableview本身的代理来处理相应的展开收起:

1.代理:- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

2. 需要声明一个全局BOOL变量isOpen,记录当前cell的状态(展开/收起),声明一个NSInterge类型selectedIndexRow,记录选择的cell的row,切记初始化相应的属性。

(ps:在网上看到很多文章都是这样,但是真的用的时候,发现,我们需要另外声明一个NSIndexPath类型的selectedIndex,或者用到时候自己运用记录的row生成也可,也许确实是我自己多此一举)

3.首先,我们需要理清自己需求的逻辑关系,什么时候展开/收起,展开收起时它的高度,个数等等有什么变化------->来进行代理,数据源方法的书写

下面也是展示tableview时的调用顺序

1>://返回cell个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  2>://返回每行的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  3>://请求数据元代理为tableView插入需要的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  4>://监听点击的cell
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

代码:

#pragma mark ---------  UITableViewDelegate && UITableViewDataSource -----

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return self.scoreDataArray.count;//根据自己的具体需要返回

}

//计算高度---根据需求,动态计算内容的高度

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

//indexPath.row == selectedIndex.row &&

NSLog(@"heightForRow   %ld",(long)selectedIndex.row);

if (indexPath.row == selectedIndex.row && selectedIndex != nil)

{

if (isOpen == YES)

{

//内部内容直接忽略即可

YunGangScoreData *data = [[YunGangScoreData alloc] init];

//data = self.scoreDataArray[indexPath.row];

data = self.scoreDataArray[selectedIndex.row];

if (data.detailTypeArray.count>0)

{

self.cellHeight = 60+data.detailTypeArray.count*40;

return self.cellHeight;

}

return 60;

}

else

{

return 60;

}

}

return 60;

}

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

{

//indexPath.row == selectedIndex.row &&

NSLog(@"cellForRow   %ld",(long)selectedIndex.row);

if (indexPath.row == selectedIndex.row && selectedIndex != nil)

{//内部内容直接忽略即可

//如果是展开

if (isOpen == YES)

{

YunGangScoreTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"YunGangScoreTableViewCell"];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

cell.data = self.scoreDataArray[selectedIndex.row];

cell.isOpen = YES;

return cell;

}

else

{//收起

YunGangScoreTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"YunGangScoreTableViewCell"];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

cell.data = self.scoreDataArray[selectedIndex.row];

cell.isOpen = NO;

return cell;

}

}

else//不是自身

{

YunGangScoreTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"YunGangScoreTableViewCell"];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

cell.data = self.scoreDataArray[indexPath.row];

cell.isOpen = NO;

return cell;

}

}

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

{

//将索引加到数组中

NSArray *indexPaths = [NSArray arrayWithObject:indexPath];

//判断选中不同row状态时候

//我自己加上的,看好多文章没有,可能我错了,selectedIndex = indexPath;

NSLog(@"%ld",(long)selectedIndex.row);

if (selectedIndex != nil && indexPath.row == selectedIndex.row)

{//将选中的和所有索引都加进数组中

// indexPaths = [NSArray arrayWithObjects:indexPath,selectedIndex, nil];

isOpen = !isOpen;

}

else if (selectedIndex != nil && indexPath.row != selectedIndex.row)

{

indexPaths = [NSArray arrayWithObjects:indexPath, selectedIndex,nil];

isOpen = YES;

}

//记下选中的索引

selectedIndex = indexPath;

//刷新

[tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];

}

大致运用的就这些内容,自己看着调试下。。。

方法二: 我试了上面方法,发现可能出现刷新等问题,也就换了下面的

这里用section当做第一个cell,然后加载view到section上,添加手势来作为点击事件,展开的内容加载cell(第二个)

直接上代码:

1.声明属性:

//cell收放,以及记录cell的selectedIndex

NSMutableDictionary *_showDic;//用来判断分组展开与收缩的

int index;

2.用section的个数来展示未点击时的tableview内容

3计算点击每个section之后展开的cell的个数

4.这里自己根据需求,以及返回的内容来计算点开后的cell应该拥有的高度

5.加载点击之后的cell内容,同时传递点击的那个section的数据信息

这里刷新数据是只刷新点开一个情况,如果点开多个,数据改变应该是下面,而在cell里面赋值则不需要了

6.根据需要计算每一个section需要的高度(我这里最后一个有需要)

7.加载每个section的内容,需要注意,这里加载的view继承

UITableViewHeaderFooterView

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

{

NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"YunGangScoreTableViewCell" owner:nil options:nil];

YunGangScoreTableViewCell* cell = [objs objectAtIndex: 0];

if (self.scoreDataArray.count>0)

{//确保有数据

YunGangScoreData *data = self.scoreDataArray[section];

cell.data = data;

}

// 单击的 Recognizer ,收缩分组cell

cell.tag = section;

UITapGestureRecognizer *singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SingleTap1:)];

singleRecognizer.numberOfTapsRequired = 1; //点击的次数 =1:单击

[singleRecognizer setNumberOfTouchesRequired:1];//1个手指操作

[cell addGestureRecognizer:singleRecognizer];//添加一个手势监测;

return cell;

}

同时,为了适配问题,我们需要在自定义的view中改变这个view的frame

8.点击手势的事件以及处理

9,需要注意的是,每次请求数据,刷新tableview的时候,需要清空_showDic

其他的内容,就自己根据需要添加修改就可以了,两种方法经过测试,第一种展示都没问题,刷新之后貌似存在混乱,如果需要使用就要好好修改下,第二种方法,测试可以使用,不存在什么大问题,满足需求,下面把效果图贴上:

UITableView点击每个Cell,Cell的子内容的收放的更多相关文章

  1. UITableview中怎么找到每个cell

    一个朋友问我:我在每个cell中都添加了两个按钮(记为btnA和btnB),点击btnA时,对应的cell中添加一个子控件,再点击btnB时,对应的cell中的子控件就移除,怎么做到? 百度了一下,发 ...

  2. 手势响应 ,避免点击多个cell同时响应同一手势多次,只响应第一个cell

    http://www.cnblogs.com/wfwenchao/articles/3700205.html UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相 ...

  3. IOS之UI -- UITableView -- 2 -- 等高的Cell

    内容大纲: 1.纯代码 添加子控件 2.Autolayout纯代码 -- Masonry框架的使用 3.自定义等高的cell -- storyboard的使用(更加简单) 4.静态cell 等高的Ce ...

  4. UI学习笔记---第十一天UITableView表视图高级-自定义cell

    自定义cell,多类型cell混合使用,cell自适应高度 自定义cell就是创建一个UITableViewCell的子类 把cell上的空间创建都封装在子类中,简化viewController中的代 ...

  5. iOS - UITableView中有两种重用Cell的方法

    UITableView中有两种重用Cell的方法: - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (id)dequ ...

  6. iOS UITableView点击按钮滚到顶部

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  7. 在 cell 中获取 textFlied内容的使用

    当您读到这里时,建议先下载demo,不懂再参考博客.在iOS项目开发中,容易遇到各种个人信息填写.比如微信中设置个人信息,等.这种方式是进行控制器跳转,代理或者block传值,这种比较容易,符合常规的 ...

  8. [RN] React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示

    React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示 问题: 0.9.0 或 0.8.0 版本的 ...

  9. 点击每个li输出里面的内容(前端很常问的面试题之一)

    点击每个li输出里面的内容(前端很常问的面试题之一) 前端 面试 JavaScript <!DOCTYPE html> <html lang="en"> & ...

随机推荐

  1. MVC5在Mono上的各种坑

    买了Macbook后,各种事情的纠缠,都没好好地用过OSX系统. 果断的装上了xcode和mono,还有monodevelop. 然后把项目移植到mono上运行,各种问题. 然后第一个问题来了 权限不 ...

  2. C#与C++的发展历程第一 - 由C#3.0起

    俗话说学以致用,本系列的出发点就在于总结C#和C++的一些新特性,并给出实例说明这些新特性的使用场景.前几篇文章将以C#的新特性为纲领,并同时介绍C++中相似的功能的新特性,最后一篇文章将总结之前几篇 ...

  3. Android下/data/data/<package_name>/files读写权限

    今天将更新模块拿到android上面测试的时候,发现在创建writablepath.."upd/"目录的时候出现Permission Denied提示BTW:我使用的是lfs来创建 ...

  4. ABP(现代ASP.NET样板开发框架)系列之22、ABP展现层——导航栏设置

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之22.ABP展现层——导航栏设置 ABP是“ASP.NET Boilerplate Project (ASP.NE ...

  5. ABP源码分析二十一:Feature

    Feature是什么?Feature就是对function的分类方法,其与function的关系就比如Role和User的关系一样. ABP中Feature具有以下属性: 其中最重要的属性是name, ...

  6. WCF学习之旅—基于ServiceDebug的异常处理(十七)

    WCF学习之旅—WCF中传统的异常处理(十六) 二.基于ServiceDebug的异常处理 从前面的示例中,可以看到客户端捕获了异常,这是我们处理异常的前提.为了有利于我们进行有效的调试,WCF提供了 ...

  7. PHP 高级编程(1/5) - 编码规范及文档编写

    PHP 高级程序设计学习笔记20140612 软件开发中的一个重要环节就是文档编写.他可以帮助未来的程序维护人员和使用者理解你在开发时的思路.也便于日后重新查看代码时不至于无从下手.文档还有一个重要的 ...

  8. dom addeventlistener与id 绑定事件的区别

    文档中有写. //addEventListener() 方法用于向指定元素添加事件句柄. //提示: 使用 removeEventListener() 方法来移除 addEventListener() ...

  9. Vue1.0 的技术栈

    vuejs概述 Vue.js是用于构建交互式的Web界面的库.它提供了MVVM数据绑定和一个可组合的组件系统,具有简单.灵活的API. 结合node.js 可以实现前后端开发从物理上的分离.使前端负责 ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(18)-权限管理系统-表数据

    系列目录 这一节,我们插入数据来看看数据流,让各位同学,知道这个权限表交互是怎么一个流程,免得大家后天雾里来雾里去首先我再解释一些表,SysUser和SysRole表不用解释了. SysRoleSys ...