iOS 02颖系、退出鍵盤的六種方式

當(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í)雌贱,帶來更好更有效地思想代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啊送,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欣孤,更是在濱河造成了極大的恐慌馋没,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件降传,死亡現(xiàn)場離奇詭異篷朵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門声旺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笔链,“玉大人,你說我怎么就攤上這事腮猖〖ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵缚够,是天一觀的道長幔妨。 經(jīng)常有香客問我,道長谍椅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任古话,我火速辦了婚禮雏吭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陪踩。我一直安慰自己杖们,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布肩狂。 她就那樣靜靜地躺著摘完,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傻谁。 梳的紋絲不亂的頭發(fā)上孝治,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天,我揣著相機(jī)與錄音审磁,去河邊找鬼谈飒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛态蒂,可吹牛的內(nèi)容都是我干的杭措。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼钾恢,長吁一口氣:“原來是場噩夢啊……” “哼手素!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘩蚪,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泉懦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后募舟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祠斧,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年拱礁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琢锋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辕漂。...
    茶點(diǎn)故事閱讀 40,435評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吴超,靈堂內(nèi)的尸體忽然破棺而出钉嘹,到底是詐尸還是另有隱情,我是刑警寧澤鲸阻,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布跋涣,位于F島的核電站,受9級特大地震影響鸟悴,放射性物質(zhì)發(fā)生泄漏陈辱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一细诸、第九天 我趴在偏房一處隱蔽的房頂上張望沛贪。 院中可真熱鬧,春花似錦震贵、人聲如沸利赋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媚送。三九已至,卻和暖如春寇甸,著一層夾襖步出監(jiān)牢的瞬間塘偎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工幽纷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留式塌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓友浸,卻偏偏與公主長得像峰尝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子收恢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容