2017-02-22 121 views
1

我有一個啓用了清除按鈕的UITextField。我也有一些代碼,駁回鍵盤當用戶點擊其他地方在屏幕上:點擊手勢識別器干擾清除按鈕

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) 
tap.cancelsTouchesInView = false 
view.addGestureRecognizer(tap) 

func dismissKeyboard() { 
    view.endEditing(true) 
} 

的問題是,這種代碼清除按鈕干擾,因此文本字段不會被清零。如何防止輕擊手勢識別器處理清除按鈕輕擊?

+0

我還以爲那手勢會按照* *向上的視圖層次結構,但也許不會。你*可以*檢測按鈕層是否被挖掘(可能甚至是視圖,但這可能是問題,一旦你知道什麼被挖掘了,你就可以正確地指導處理流程。 – dfd

+0

那麼,如果用戶點擊它會發生什麼?應該優先考慮按鈕還是手勢或兩者兼而有之?如果一個人沒有開火手動調用IBAction併發送按鈕作爲發件人 – GregP

+0

該按鈕應該優先,而且我還有一個普通的UIButton在屏幕上應該優先,但它總是手勢識別器。 – user2397282

回答

2

想通了一種方法來防止這種情況發生。

所以清除按鈕的類型是UIButton,所以我們不希望手勢識別器識別那些水龍頭。

這個函數被調用時,手勢識別接收到一個水龍頭:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 
    // Don't handle button taps 
    return !(touch.view is UIButton) 
} 

行:

return !(touch.view is UIButton) 

將返回false如果地方挖掘用戶是UIButton和真實的,否則。

所以false =手勢識別器不會處理tap,而true = tap會被處理。

不要忘記添加UIGestureRecognizerDelegate並使用下面的行設置:

tap.delegate = self