收起鍵盤的方式通常有兩種:辭去當(dāng)前控件的第一響應(yīng)者身份或者關(guān)閉父控件的可編輯狀態(tài)。
1、辭去當(dāng)前控件的第一響應(yīng)者身份
[textField resignFirstResponder];
2、關(guān)閉父控件的可編輯狀態(tài)
[self.view endEditing:YES];
第一種方式直接對(duì)相應(yīng)的textField進(jìn)行處理,適用于只有一個(gè)輸入框、or明確知道要關(guān)閉哪個(gè)textField的輸入狀態(tài)的情況。
第二種方式簡單粗暴,關(guān)閉當(dāng)前view所有的編輯狀態(tài),堪稱萬精油。
當(dāng)拿不到父控件的時(shí)候,還有更暴力的方式:
3、[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
------------我是分割線------------
以上只是常規(guī)的處理,通常當(dāng)你用度娘或者google來尋找解決方案的時(shí)候,以上的方法肯定都嘗試過了、并且毫無效果。
艸蛋場景一:
訂單支付頁面,處于編輯狀態(tài)->點(diǎn)擊頁面返回按鈕->出現(xiàn)提示彈框->點(diǎn)完彈框,原本收起的鍵盤又會(huì)閃現(xiàn)一下,最后返回到上一頁面。
說了這么多,罪魁禍?zhǔn)拙褪悄莻€(gè)彈框。
在鍵盤的收起動(dòng)畫還沒結(jié)束的時(shí)候,彈框彈了出來,搶走了textFiled的第一響應(yīng)者身份。彈框消失后,textField又變回了第一響應(yīng)者,繼續(xù)執(zhí)行鍵盤收起的動(dòng)畫。。。
解決方案:在點(diǎn)擊頁面返回按鈕的時(shí)候,在其點(diǎn)擊事件首先將textFiled的第一響應(yīng)者身份resign掉(或[self.view endEditing:YES];)。這樣當(dāng)彈框成為又辭去第一響應(yīng)者之后,textFiled也不會(huì)成為第一響應(yīng)者。(通俗的講,就是敵軍已經(jīng)殺到老家,為了避免被俘,趕緊自殺)。
剛開始遇到這個(gè)問題的時(shí)候,網(wǎng)友給出的方案:
有些情況不知道誰是第一響應(yīng)者,可以先[textField becomeFirstResponder];再[textField resignFirstResponder];
艸蛋場景二:
選擇地址頁面,在輸入框輸入地址->點(diǎn)擊地址cell->出現(xiàn)提示彈框->點(diǎn)擊彈框push到新的頁面->新頁面鍵盤閃現(xiàn)鍵盤。
按照上述場景一的解決方案,在didSelectRowAtIndexPath:方法里[你的textField resignFirstResponder]即可。
//在沒有耗時(shí)操作的情況下,這樣做確實(shí)可行。(錯(cuò)誤想法)
//本場景點(diǎn)擊完地址cell會(huì)有一個(gè)耗時(shí)的逆地理反查的過程,這個(gè)時(shí)候上面的方法就不起作用了。(錯(cuò)誤想法)
思考:在走didSelectRowAtIndexPath:方法時(shí),對(duì)相應(yīng)的textField做resign操作,可能是無效的。因?yàn)閏ell正在辭去自己的第一響應(yīng)者身份,很有可能還沒辭完,此時(shí)對(duì)并不是第一響應(yīng)者的textField做resign操作自然是無效的。
解決辦法:在彈框代碼的上一句,[你的textField resignFirstResponder];
還有別的疑難場景的歡迎補(bǔ)充~