2016-07-02 160 views
1

我有多個文本框,因爲我是怎麼通過屏幕上的任何竊聽貶的關閉UITextField鍵盤?

@IBOutlet var emailLogin: UITextField! 
@IBOutlet var passLogin: UITextField! 
@IBOutlet var emailSignUp: UITextField! 
@IBOutlet var passSignUp: UITextField! 

截至目前這些都不是真正需要的,不過我也希望它當我按下回車鍵解僱。

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.emailLogin.delegate = self 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(LoginViewController.dismissKeyboard)) 
    view.addGestureRecognizer(tap) 
} 

第一個問題:當我需要的只有一個解僱我會設置委託像這樣,但我要如何處理這個問題時,我已經對返回鍵被開除需要多個視圖?

此外,有兩個單獨的視圖,但都使用相同的類。這是我想要做什麼的問題?

從這裏

func dismissKeyboard() { 

    view.endEditing(true) 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 
    return true 
} 

這駁回了鍵盤,但只爲我設置爲自己的文本字段。

任何信息表示讚賞!

編輯: I could be doing this wrong

+1

不太理解你的第一個問題。您必須將所有textField的委託設置爲'self'才能觸發委託。然後在委託函數中,針對IBOutlet變量檢查'textField'以獲得不同的反應。它們在哪裏並不重要。 –

+0

如果我將它們全部設置爲代表。它給了我糟糕的指導錯誤。 – Casey

+0

你可以創建一個示例項目,並將其放在GitHub上? –

回答

2

你的代碼更改爲以下,它應該工作:當你的LoginViewController負載,從而以展開最終

@IBOutlet var emailLogin: UITextField? 
@IBOutlet var passLogin: UITextField? 
@IBOutlet var emailSignUp: UITextField? 
@IBOutlet var passSignUp: UITextField? 

emailLogin?.delegate = self 
passLogin?.delegate = self 
emailSignUp?.delegate = self 
passSignUp?.delegate = self 

IBOutlets從其他類未初始化nil對象,這在Swift中是不允許的。 (您應該能夠在Xcode中的控制檯輸出中看到這一點。)使用可選變量將防止發生這種情況。

+0

太棒了!按預期工作!真的很感謝幫助! – Casey

0

使用ViewControllerDelegate處理任何textField和textView外部的輕觸。當您在textField外部輕按時,它將關閉鍵盤。把下面的代碼在您的視圖控制器:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    super.touchesBegan(touches, withEvent:event) 
    self.view.endEditing(true) 
} 

你並不需要添加TapGesture現在處理這個問題。