iOS開發中按鈕多次響應問題解決方案

iOS開發中按鈕多次響應問題解決方案

本文主要介紹在iOS開發中, 關於按鈕多次快速點擊, 響應多次的問題, 其實大多數時候我們希望按鈕的響應事件只執行一次, 儘管我們快速點擊按鈕, 但是還是希望只響應一次, 那麼在這種情況下, 就需要我們人爲控制, 本文給出一種合理的解決方案, 希望對大家有幫助。

其實,遇到關於按鈕的事件, 我主要介紹以下兩種情況:
1. 存在網絡請求的按鈕事件(網絡延遲)
2. 頁面路由相關的跳轉事件(界面跳轉,push, present等)


存在網絡請求的按鈕事件

首先, 介紹關於存在網絡請求的按鈕事件, 這種事件應該在開發中是經常遇到的,
例如:登錄按鈕事件,如果我們快速多次點擊按鈕, 會不會多次觸發登錄請求?第一次登錄請求結果未返回之前,再次點擊登錄按鈕, 要不要觸發下次登錄請求?

這種情況下,解決方案其實很簡單:那就是在按鈕點擊之後, 將按鈕設置爲不可用, 等到網絡請求的結果返回後, 重新設置按鈕爲可用狀態。

這裏的實現方案很簡單, 其實有個小細節就是:我們是使用enabled屬性還是userInteractionEnabled屬性來設置可用狀態, 對於button而言, 如果使用enabled屬性, 會發現button的樣式發生了變化, 而userInteractionEnabled屬性則不會產生任何變化, 建議uiview子類使用userInteractionEnabled來設置可用狀態, 而像buttonItem這種就可以使用enabled來設置。


頁面路由相關的跳轉事件

至於這種情況, 其實不想button點擊事件那樣容易發現, 例如我們點擊按鈕push下個界面, 如果我們快速點擊多次, 會發現push出來多個相同的界面, 顯然這個不是我們想要的結果, 這種問題的解決思路其實也和上面一樣, 只是處理方法不太一樣,因爲這裏涉及到界面的跳轉, 相對比較麻煩。

先說一下, 我在項目中的處理思路, 因爲我們界面跳轉方式大致就是push,pop,present,dismiss等, 因此我們在UIViewController的分類統一定義了這幾種跳轉方式, 大致是以下幾個方法, 其實跟之前不太一樣的就是多了一個sender的參數, 這個其實就是觸發事件的載體,在方法體中我們需要控制sender的可用狀態。

這裏還有一點需要提到的是,當我們使用present方式展現的時候, 有時候需要在外面包裝一個navigationController, 這裏也一併處理了。

#pragma mark - 頁面跳轉

- (void)presentPage:(UIViewController *)viewController embededInNav:(BOOL)embeded sender:(id)sender animated:(BOOL)animated completion:(void (^)(void))completion;
- (void)pushPage:(UIViewController *)viewController sender:(id)sender animated:(BOOL)animated;

- (void)closePageWithSender:(id)sender animated:(BOOL)animated;
- (void)dismissPageWithSender:(id)sender animated:(BOOL)animated completion:(void (^)(void))completion;
- (void)popPageWithSender:(id)sender animated:(BOOL)animated;

關於具體的內部實現, 大家可以自行處理, 這裏只是提供解決思路。

總結

到這裏兩種情況就介紹完了, 這也是我在項目中使用到的解決方法, 希望對大家有幫助, 有什麼不足的地方, 也歡迎糾正補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章