实际操作-手把手探究tableViewCell上的控件点击事件进阶篇:实际项目操作

      自从15年iOS开发市场大热之后,最近两年行情确实有点惨淡,看到很多企业招聘要求动不动就2年/3年以上iOS开发经验,确实有点无奈,感觉对初学者或者刚入门的小白们比较不友好。

     现在学iOS的很多都是培训出来的,给他需求,他知道代码要怎么打才能让App跑出符合需求的效果,但是很多稍微底层的,或者原理性比较不了解,下面就让我们以纯iOS小白的视角,手把手一步步探究tableView中Cell上的控件点击事件。(面试的时候也可以体现探究精神,很加分)

iOS17年4月市场背景~

探究tableViewCell的点击事件步骤:

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


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

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

测试Cell上控件的点击事件

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

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


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

测试如上:不会同时触发两个点击效果

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

imageView的点击事件

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

addTarget方法底层

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

UIButton继承自UIControl,所以有addTarget方法

UIImageView不继承UIControl,所以没有addTarget方法

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

答:使用手势。

为imageView点击点按手势(Tap)

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


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

imageVIew的点击

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

打开imageView的用户交互事件


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

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

如同:cell上的点击事件实现页面跳转

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

cell的push操作

如同,因为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方法可以得到:

tableVIewCell设置数据源

数据请求何时发送?

在cell的设置数据源的时候发送请求

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

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

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


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

解释如下图:

原理解释

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

-->而且完美解决了AFN异步网络请求导致的需要数据可能为空的问题,也希望能给新手们提供一点探究原理的思路和流程,小tips:面试的时候,如果你体现出对技术的渴望,对底层原理的探究,探究的思路和步骤等等,都可能会给面试官留下一个好印象(很关键!),有时候,你的一个学习态度,就决定了你能否拿到这份offer~希望能帮到有需要的小白们~

抽空写了一个简单Demo:Demo

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏不止是前端

Node:使用Puppeteer完成一次复杂的爬虫

1.2K90
来自专栏Danny的专栏

html页面导出为pdf(jsPDF、iText、wkhtmltopdf)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1.8K10
来自专栏Puppeteer学习

Headless Chrome:服务端渲染JS站点的一个方案【上篇】【翻译】介绍Headless Chrome 预渲染页面

34350
来自专栏数据小魔方

左手用R右手Python系列——任务进度管理

一直觉得运行代码的时候,如果有一个提示任务运行进度的进度条提示就好,很多时候我们的程序运行时间普遍较长,如果程序运行没有任何提示,那简直是一场噩梦,根本不知道到...

41050
来自专栏编程微刊

手把手教你用vue-cli构建一个简单的路由应用

上一章说道:十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635

11910
来自专栏琯琯博客

超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集

一、谷歌浏览器插件 二、Sublime Text 插件 三、Phpstorm 插件 四、油猴脚本 4.1 脚本网站 4.2 自用的脚本 五、相关链接 ? 分享...

1.3K80
来自专栏程序员同行者

html基础+常用标签

19410
来自专栏程序员的碎碎念

JavaGUI编程之·引用类库Beautyeye改变外观

上一期讲到JavaGUI默认界面在win7上显示得比较粗糙,小编在原来的基础上对各种组件的属性进行大量修改才得以让原界面扁平化。上期推文发出后,就有大神提供建议...

1.3K90
来自专栏武军超python专栏

2018年8月7号升级飞机大战的总结

今天学到的新单词: indentation  n缩进 transform  v改变,变换 collide v碰撞 recursion  n递归

12420
来自专栏腾讯IVWEB团队的专栏

浏览器自动化测试初探:使用 phantomjs 与 casperjs

个人认为自动化测试的主要出发点有两点: 减少重复的工作。第一点,让机器自动帮我们完成需要的交互操作,验证我们的页面功能。第二点,自动监控。通过自动回归我们的页面...

95000

扫码关注云+社区

领取腾讯云代金券