如果你曾經在tableView上實現一個可輸入的表單,那么一定會遇到鍵盤隱藏的問題。那一般我們會使用在控制器重寫touchBegan: withEvent:方法,然后在方法里面處理如下:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
}
恩,那我們就會立馬在管理tableView的控制器上這么去寫,然后興沖沖的run起來~
結果呢,你怎么點都鍵盤都隱藏不掉,打個斷點吧,死活進不去。這時候納悶了,為什么以前用的好好的,現在卻用不了了呢???
這時,我們會想到難道是因為tableView的問題?那讓我們來測試下。
測試過程
首先,我們先驗證下UITableView/UIScrollView是否可以接受touch事件。
我們新建一個UIViewController,然后添加一個我們自定義的table,在table里面放置的cell也使用我們自定義的cell。在自定義的table和cell里面都重寫touchBegan: withEvent:方法。如下
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[[self nextResponder] touchesBegan:touches withEvent:event];
}
為什么要[self nextResponder]呢,根據響應鏈的規則,如果view在響應到touch事件后不往上層拋出的話,上層的view/viewController是沒法響應這個事件的,不太清楚的可以參考響應鏈
然后在控制器重寫touchBegan: withEvent:方法。進行測試。
(因為也沒啥難的代碼,就不給了~~)
測試結果
我們發現,當你點擊cell的空白處的時候,cell可以響應到touch事件,之后會根據響應鏈傳到tableView,再傳到控制器。所以其實UITableView/UIScrollView是可以響應touch事件的。
只不過就算我們知道可以這樣處理了,但你會這樣用嗎?我想沒人肯這樣子吧。其他先不說,單為了處理觸摸事件就要搞兩個繼承,太TM蛋疼了。。。
所以接下來向大家介紹另一個解決辦法。
解決辦法
上面的介紹只是說明這個方法其實是可以的,真要實際運用的還是建議采用下面的方法。這里要做兩個處理(記住,一定是兩個處理一起)
處理1
這里跟網上介紹的方法類似,就是在tableView上添加一個手勢,然后在手勢中添加處理方法。這個方法可以解決當點擊tableView空白地方生活,鍵盤隱藏的問題。但是當滾動table的時候一樣是沒法處理的。
處理2
UITableView提供了一個屬性“keyboardDismissMode”,這個屬性默認是“UIScrollViewKeyboardDismissModeNone”就是什么都不做。我們將它設置為“UIScrollViewKeyboardDismissModeOnDrag”,這樣在滾動tableView的時候就可以隱藏鍵盤了