实际操作-手把手探究tableViewCell上的控件点击事件

如题所述

第1个回答  2022-07-11
    下面就让我们以纯iOS小白的视角,手把手一步步探究tableView中Cell上的控件点击事件。

1.tableViewCell上的控件触发点击事件

我们都知道,tableViewCell的点击事件,写个“didSelectRowAtIndexPath”方法就能实现行点击效果,经常我们做的是行点击之后页面跳转(push到另一个界面);

此时:如果我们在cell上自定义几个控件,然后点击控件,想要实现控件的点击效果,不实现cell的行点击效果:

参与测试的cell上的两个控件:一个UIButton,一个UIImageView。

我们都知道,UIButton的点击事件:添加一个addtarget,然后选择点击触发:UIControlEventTouchUpInside,就可以实现Btn的点击事件。

-->探究1:点击Button的时候,因为Button在cell上,是否会同时触发Button的点击事件以及 cell的行点击事件?

-->探究2:ImageView的点击事件

-->探究3:为啥ImageView 没有 UIbutton 的addtarget方法?

如图,我们发现addTarget并不是所有的类都有这个方法-->只有UIControl的子类才能有这个方法!

-->探究4:没有addTarget方法的ImageView如何添加点击事件?

答:使用手势。

这里要切记:选择手势别选错,也别选默认的手势,要选择点按的Tap手势;

----------------测试:是否会和Btn一样,触发imageView的点按手势,不触发cell的行点击事件!

原因:imageView需要手动打开用户交互!

拓展:UIView,UIButton默认是可以进行用户交互,如果父控件不能(or 手动关闭用户交互),子控件即使是UIButton,也无法触发交互事件(例如点击事件)!!

2.tableViewCell上的控件触发点击事件实现页面跳转

需求:通过点击cell上的不同的按钮-->实现不同页面跳转

如同,因为tableViewCell不是ViewController,没有navigationVC属性,并不能实现控制器的push操作!

-->解决办法:值回传-->通过控制器实现页面跳转!

回传的方法:a.通知(没跨界面的话用通知有点鱼,比较low)

                     b.代理/Block,这里差不多,我使用的是代理,可以仅适用一个代理方法,将按钮的tag传过去判断。

需求如下:1.有网络数据请求;2.cell的数据是从控制器传过去的(可以通过字典转模型);3.使用AFN请求数据(异步请求)

问题:何时发起数据请求?

答:因为我们一开始并不知道要点击的是哪行的数据->在tableView的行点击(didSelectRowAtIndexPath)的时候,由于我们可以拿到点击的下标,通过下标可以知道我们点击的是哪行,此时发送数据请求

-->错误:1.我们点击的是头像(UIImageView),触发的是头像的点按手势,并不会调用didSelectRowAtIndexPath方法;

              2.异步请求,在点击的时候,发送请求,点击整个操作结束后,异步的请求都不一定执行完,由于异步执行,数据经常是当时获取没完成就接下去执行了,导致数据为空;

              3.在2的基础上,执行完didSelectRowAtIndexPath之后AFN请求完毕,获取数据成功,以往我们经常调用tableView的刷新数据方法-reloadData,但是我们会发现didSelectRowAtIndexPath并不会再tableView reloadData之后再被调用一次!!所以导致了:数据一直是空的可能性!

-------------------------华丽分割线------------------------

正确做法:不在tableView的行点击进行数据请求,要拿到数据下标,并不只有didSelectRowAtIndexPath方法可以得到:

数据请求何时发送?

-->在cell界面加载的时候,就会自动发送网络请求获取数据

当我们点击的时候,cell界面都不知道加载完成多少秒了,此时AFN发送的异步请求怎么说也该请求成功了(逻辑严谨性:此时加个网络请求数据是否成功的判断,成功在展示可以点击的按钮)

-->怎么让控制器知道我们点击了哪行的cell --> 没有触发cell的didSelectRowAtIndexPath方法

我们拿到的当前行的数据,是tableView - cellForRowAtIndexPath方法设置cell数据展示的时候,一行一行传过来的,所以每个indexPath.row对应的数据,我们通过网络请求+数据回传(通过代理),还是当前行的数据!

解释如下图:

如图:我们并不调用行点击事件,但是当我们点击cell的按钮,通过代理把cell的内容(如上图的内容:b)回传到控制器tableView上显示的时候,从tableVIew展示的内容-->b,我们就可以知道刚才点击的是哪个cell里面的按钮!

-->而且完美解决了AFN异步网络请求导致的需要数据可能为空的问题,也希望能给新手们提供一点探究原理的思路和流程

抽空写了一个简单Demo: Demo

实际操作-手把手探究tableViewCell上的控件点击事件
1.tableViewCell上的控件触发点击事件 我们都知道,tableViewCell的点击事件,写个“didSelectRowAtIndexPath”方法就能实现行点击效果,经常我们做的是行点击之后页面跳转(push到另一个界面);此时:如果我们在cell上自定义几个控件,然后点击控件,想要实现控件的点击效果,不实现cell的行点击效果:参与测试...

如何实现点击TableView中的一个cell,然后动态改变cell的文字
如果我们按照QQ那样来做。首先你得有这么一个头控件。比如这个头控件可以被点击,有个UILable,能给他赋予标题,有个小箭头,点它会像QQ那样会旋转。当然,为了记录这个小箭头箭头是向下,还是向右,你需要一个能决定它方向的属性。(如果只有两个方向用BOOL值就可以了)。。。为了方便,这里我就不写这...

如何在tableviewcell点击后跳转到另一个view
如何在tableviewcell点击后跳转到另一个view 搜索资料 我来答 分享 微信扫一扫 新浪微博 QQ空间 举报 浏览8 次 本地图片 图片链接 代码 提交回答 匿名 回答自动保存中为你推荐:特别推荐幸福小调查:你认为自己是幸福吗? 电影中用牙齿拔出手榴弹拉环安全吗? 为何有些山,是平顶的? 男子吃小龙虾致过敏休克...

iOS UITableView中关于cell里的按钮被点击时如何确定是哪一个
可以写一个Block回调 不同的按钮触发不同的回调方法 然后在controller里执行按钮的触发事件

怎么解决tableviewcell卡顿时多次响应点击事件
首先定义一个BOOL类型来判断是否点击了第一次 property (nonatomic, assign) BOOL isSelect;然后再点击事件中这样写 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ \/\/防止重复点击 if (self.isSelect == false) { self.isSelect = true;\/\/在延时...

点击tableView中的cell并返回时,怎么取消它的选择状态
在UITableView里面,选择了某一个cell以后,点击立刻取消该cell的选中状态,可以使用如下方法:\\x0d\\x0a\\x0d\\x0a-(void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath\\x0d\\x0a{\\x0d\\x0a\/\/somefunctions\\x0d\\x0a...\\x0d\\x0a\\x0d\\x0a\/\/取消选...

IOS 类似于微信的点赞,在tableviewcell 上添加了一个button,点击则显示...
然后在方法 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 中进行获取这个tag值,获取方法是: UIButton *exitBtn = (UIButton *)[cell viewWithTag:1];\/\/1是我上面设置的tag值 这样就获取到了,你再给他添加action事件就可以了,

如何实现UITableViewCell上的双击事件
switch (tapCount){ case 1: \/\/single tap [self performSelector:@selector(singleTap) withObject: nil afterDelay: .4];break;case 2: \/\/double tap [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap) object:nil];[self performSelector:@selector(doubleTap...

如何在tableviewcell点击后跳转到另一个view
在uiview里面的tableView中,点击cell进入跳转到另一个界面的方法 1.先找到view对应的viewController - (UIViewController *)viewController { for (UIView* next = [self superview]; next; next = next.superview) { UIResponder *nextResponder = [next nextResponder];if ([nextResponder ...

点击tableViewCell 里的 button 时如何确定是哪一个 cell
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) { cell = [[UITableViewCell alloc]...

相似回答
大家正在搜