當(dāng)UITextFeild和UITextView處于編輯界面時(shí),這些控件成為了鍵盤的“第一響應(yīng)者”忆蚀。要編輯鍵盤就要放棄第一響應(yīng)者的身份矾利。在iOS中,事件沿著響應(yīng)者鏈從一個(gè)響應(yīng)者傳到另一個(gè)響應(yīng)者馋袜,如果其中一個(gè)響應(yīng)者沒有對事件做出響應(yīng)男旗,那么該事件會重新向下傳遞。顧名思義,"第一響應(yīng)者"是響應(yīng)者鏈的第一個(gè)欣鳖,不同的控件成為“第一響應(yīng)者”之后的“表現(xiàn)”不太一樣察皇,UITextFeild和UITextView等輸入類型的控件會出現(xiàn)鍵盤,而當(dāng)我們放棄“第一響應(yīng)者”的身份后泽台,鍵盤才可以關(guān)閉什荣。
綜上是對退出鍵盤原理的闡述,接下來我們對處理鍵盤的退出方式做一個(gè)簡單的介紹:
前提:工程中的變量和屬性的聲明沒有提供怀酷,實(shí)現(xiàn)代碼僅供參考用于提供開發(fā)思想
// self.backKeyText為控制器中鍵盤的全局屬性
//(1)稻爬、手勢退出:當(dāng)我們開發(fā)過程中不再需要使用虛擬鍵盤時(shí),只需點(diǎn)擊虛擬鍵盤和編輯區(qū)域外的地方胰坟,就可以將彈出的虛擬鍵盤收起(采用touchesBegan: withEvent: 方法)
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
[self.backKeyText resignFirstResponder];
}
//(2)因篇、return鍵(換行鍵)退出鍵盤:第二種方式就是當(dāng)我們開發(fā)過程中不再需要使用虛擬鍵盤時(shí),只需點(diǎn)擊return鍵或者換行鍵笔横,就可以將彈出的虛擬鍵盤隱藏
//點(diǎn)擊return 按鈕 去掉
//此時(shí)也可以利用tag屬性將self.backKeyText設(shè)為第一響應(yīng)者(例如self.backKeyText.tag = 1000)竞滓,判斷如果tag不為1000時(shí)鍵盤不作彈出和退出響應(yīng)
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.backKeyText resignFirstResponder];
return YES;
}
//(3)、UIControl Event TouchUpInside吹缔,進(jìn)行連接設(shè)置IBAction在方法中寫[self.backKeyText resignFirstResponder] 也可實(shí)現(xiàn)退出鍵盤的操作
//(4)商佑、在viewDidLoad中利用NSNotificationCenter 進(jìn)行注冊隱藏鍵盤的實(shí)現(xiàn)方法,在鍵盤彈出后顯示退出鍵盤的按鈕厢塘,在按鈕的方法中執(zhí)行隱藏鍵盤茶没,這個(gè)方法提供參考
//viewDidLoad添加的代碼為:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (hideKeyboardBtnShow:) name: UIKeyboardDidShowNotification object:nil];
//設(shè)置隱藏鍵盤按鈕顯示的實(shí)例方法
-(void)hideKeyboardBtnShow:( NSNotification *)notification {
hideBtn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
hideBtn.frame = CGRectMake(150, 300, 40, 40);
[hideBtn setTitle:@"退出鍵盤" forState: UIControlStateNormal];
[hideBtn addTarget: self action:@selector(hideKeyboard) forControlEvents: UIControlEventTouchUpInside];
[self.view addSubview:hideBtn];
}
//隱藏鍵盤的實(shí)現(xiàn)調(diào)用方法
-(void)hideKeyboard {
[self.backKeyText resignFirstResponder];
[hideBtn removeFromSuperview];
}
//釋放NSNotificationCenter肌幽,Observer不能為空
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
//(5) 、UITextField和UITextView有一個(gè)inputAccessoryView的屬性抓半,當(dāng)你想在鍵盤上展示一個(gè)自定義的view時(shí)去退出鍵盤時(shí)喂急,可以設(shè)置該屬性。你設(shè)置的view就會自動和鍵盤keyboard一起顯示了笛求。像是在數(shù)字鍵盤這種無return換行字元時(shí)廊移,又不太方便設(shè)置手勢處理,那么我們還可以通過自定義UIToolBar創(chuàng)建一個(gè)View添加到鍵盤上部分探入,設(shè)置一個(gè)按鈕狡孔,添加退出鍵盤的實(shí)例方法,然后在把這個(gè)View直接賦值給inputAccessoryView也可完成操作
//注意:自定義的view只需要賦給屬性inputAccessoryView就可以了蜂嗽,不要再做其他多余的操作因?yàn)檫@個(gè)自定義的view不在其他視圖或者其他子視圖中苗膝;但是inputView是全部覆蓋鍵盤,如果采用inputView則無法彈出鍵盤植旧,需按照自己的需求做選擇使用
//具體代碼如下:
UIToolbar *hideKeyboardView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, width, 44)];
UIButton *hideKeyboardBtn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
hideKeyboardBtn.frame = CGRectMake(width-50, 10, 50, 20);
[hideKeyboardBtn setTitle:@"完成" forState: UIControlStateNormal];
[hideKeyboardBtn addTarget: self action:@selector(hideKeyboard) forControlEvents: UIControlEventTouchUpInside];
[hideKeyboardView addSubview:hideKeyboardBtn];
[self.backKeyText setInputAccessoryView:hideKeyboardView];
// 此方法和(1)均用textField代理方法去做的處理辱揭,所以類似的textView退出鍵盤的操作也可采用代理的方式進(jìn)行處理退出鍵盤的操作
//(6)、實(shí)現(xiàn)textField的代理方法:此方法是判斷當(dāng)鍵盤的內(nèi)容發(fā)生變化時(shí)隆嗅,是不是應(yīng)該用輸入的string添加到到鍵盤中界阁,判斷如果按的是回車鍵,判斷輸入的字符為\n胖喳,代碼做放棄第一響應(yīng)者身份的操作泡躯,退出鍵盤
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(nonnull NSString *)string
{
if ([string isEqualToString:@"\n"]) {
[self.backKeyText resignFirstResponder];
return NO;
}
return YES;
}
總結(jié)一哈:個(gè)人在開發(fā)過程中遇到幾次退出鍵盤操作了,所以作了一個(gè)總結(jié)丽焊,由于個(gè)人能力有限较剃,理解和采用的實(shí)現(xiàn)方法可能不夠完善,如有問題和疑問技健,可以評論溝通写穴,謝謝,個(gè)人會努力學(xué)習(xí)雌贱,帶來更好更有效地思想代碼