因為項目是屬于效率工作類軟件,程序中大量界面都涉及到了實時的數據保存。昨天做任務標題實時保存時處理的不大好,這里記錄一下。
如圖 有三個數據處理項。一個是完成按鈕 一個是標題 一個是任務下發成員。除了標題之外,其余兩個都很好做。比如完成按鈕 切換選中狀態的時候就可以發送網絡請求給服務器,下發成員從成員控制器返回后可以發送請求給服務器。
對于標題而言。如果做實時保存的話明顯不大可行,總不可能標題一變就發送請求。那你輸入的時候 是不是一直會發送網絡請求呢。所以我選擇了失焦保存去處理。也就是說用戶在輸入的時候不做處理,當用戶輸入完了,UITextView失去焦點的時候發生請求給服務器保存數據。但這會導致一個問題,如果用戶輸入完標題后,立馬點擊左上角的返回保存按鈕,此時并不會立即觸發失焦事件,而是先觸發返回事件,這樣的話控制器銷毀了,對應的失焦事件代碼也不會再執行了。
為了解決這個問題,我第一次處理的方法是加了一個變量,實時記錄標題。在返回的時候再保存一次。
這樣完全可以解決問題。但是不好的點在于,當用戶輸入完標題后并沒有立即點擊返回按鈕,而是操作了任務的其他功能項,觸發失焦事件保存當前標題,這樣返回的時候會多一次保存。這種解決思路并不好。
今天無意中看到筆記模塊自己之前寫的代碼,發現這個問題只需要用一句代碼就可以完美解決:【self.view endEditing:YES】
這樣既可以避免重復保存的情況出現,又可以潔簡代碼。
后來我想了一下,這句代碼我一直在用。但是為什么出現問題的時候我并沒有第一時間想到這個。因為我在一開始想問題的時候方向就錯了。
既然問題是因為用戶輸入完標題后直接返回 會先觸發返回事件,從而導致失焦保存方法不執行,我不應該去想在返回事件里處理一下這種特殊情況。我應該想的是避免這種特殊情況。這是很重要的一點,通俗來講,就是遇到一種特殊情況,我們首先考慮的應該是避免這種情況的發生而不是加一堆無意義的代碼去處理這種情況。放在我的項目里來說,也就是在返回之前讓頁面的所有view結束編輯狀態,這樣就可以在返回之前觸發失焦事件,這才是問題最好的解決思路。