點擊Cell上按鈕出現Cell的左滑刪除編輯界面 - runtime小應用

iOS自帶左滑刪除,只要設置可編輯就可以了;如果想自定義刪除界面的顯示,則可以看一下這篇文章,定制你想要的左滑界面。

但是某天產品經理說:某些安卓用戶可能不知道左滑這個操作,要加一個按鈕,也要有相同的操作;崩潰中...工作還是要繼續,沒辦法要生存嘛;開始擼代碼。。。

當我們不知道怎么實現一個功能的時候,我一般的步驟時:

1:先看一下現有控件支不支持,能不能實現這個需求;

command + 鼠標 點擊進UITableViewCell的API文件中,遍歷一遍有沒有可用方法或者屬性

找到:

?- (void)setEditing:(BOOL)editing animated:(BOOL)animated;?

嘗試一下,然而并沒有什么卵用;

UITableView也有這個方法,設置一下并不是我們想要的效果;

繼續找,然后,然后就沒有了。。。

2:百度,谷歌

網上都是一些自定義刪除樣式的博客說明,并沒有實現這種需求的類似demo,博客等;(可能有,我沒搜到,據說是有一個自定義cell實現,但是我沒找到)

3:自己實現,想各種方法

3.1,自定義界面:

想著自定義一個cell,自己實現這種效果,但是自己實現的總感覺效果不好,動畫不流暢,還要改很多代碼,想想都麻煩,想著蘋果都有這種效果了看看能不能從其他方式實現;

3.2,研究系統自帶的實現原理,調用底層方法來實現它:

? ? ? 回顧之前第一步調用UITableView 的- (void)setEditing:(BOOL)editing animated:(BOOL)animated;會出現一個紅色減號,點擊這個減號就會出現這個效果;這就有兩種思路來處理:

第一種:找到觸發動畫的方法,直接調用Runtime方法發送消息

? ? ? ?由于無法看到源碼,那就想辦法看到調用方法的順序,找到方法名就好;而查找方法調用順序最好的調試方法就是打斷點看調用堆棧,斷點打在哪呢?UITableViewCellStateMask 這個枚舉是cell編輯時所處于的狀態,而UITableViewCellStateShowingDeleteConfirmationMask這個狀態就是處于顯示刪除的狀態;監測這個狀態就好,幸好系統給了我我們這個方法- (void)willTransitionToState:(UITableViewCellStateMask)state,重寫這個方法,并打斷點調試查看調用堆棧

打斷點看調用堆棧

找到能實現那個的那個方法,看方法名找到setShowingDeleteConfirmation: 這個方法,參數應該是bool類型的;在按鈕的惦記方法直接調用:

?objc_msgSend(self, NSSelectorFromString(@"setShowingDeleteConfirmation:"),YES);?

調用這個必須倒入頭文件:#import<objc/message.h> ,如果上述方法報錯看這里

這樣就可以實現需求,但是這種方法的弊端是[tableView setEditing:NO];失效了,造成這種情況的原因是我們直接發送消息并沒有從點擊按鈕的執行方法,而是半路插入,解決辦法是

在調用[tableView setEditing:NO]的地方改用發消息:

objc_msgSend(self, NSSelectorFromString(@"_animateSwipeCancelation"));

自己測試了一下是沒有問題的,也沒有出現閃退或者其他bug;

這種方式智能在Xcode8.0才能實現;如果你的Xcode8.0要是支持7.0的系統的話,這種方式就是不行的,可能是系統在升級的時候某些方法優化了

如果非要支持7.0的就比較麻煩了,因為上面的那種方式取巧了,正好動畫就是在那個方法中或者之后執行的,因此可以使用;但是iOS7.0的庫中的方法就不知道在那個方法執行了,也不知道執行條件,所以就要尋求另外一種方式了;

第二種方法,找到紅色按鈕,不出意外的話應該是繼承自UIControl的,然后直接響應事件(這種操作比較保險,但是代碼較多,改動的也比較多)


具體步驟:

3.2.1:點擊button的時候設置[tableView setEditing:YES],使紅色編輯按鈕被創建現實出來;同時記錄當前編輯的cell

animationBlock是cell的一個回掉block;
?設置只有操作的cell才可編輯,出現紅色按鈕

3.2.2:找到紅色編輯按鈕,直接觸發紅色按鈕的響應事件,這樣就能實現我們想要的效果了

找到紅色編輯按鈕方法UITableViewCellEditControl可在姨媽巾中看到


查找紅色按鈕
找到紅色按鈕是一個是UIControl類型的,直接出發點擊方法,紅色圖標隱藏


3.2.3,效果出現之后,在用戶操作完成之后要確保之前設置的東西歸位

在調用[tableView setEditing:NO animated:NO];方法后會觸發該方法,然后將編輯時所設置的一些改變還原,保證左滑手勢不會出問題

這樣就大功告成了,demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容