當前位置:成語大全網 - 新華字典 - 實際操作-手把手探究tableViewCell上的控件點擊事件

實際操作-手把手探究tableViewCell上的控件點擊事件

下面就讓我們以純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