2014-06-12 36 views
141

我正在使用UITextfied雖然點擊textfied鍵盤會出現,但當我按下回車鍵,鍵盤不會消失。我使用下面的代碼。如何在按回車鍵時快速隱藏鍵盤?

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore. 
{ 
    return true; 
} 

該方法resignfirstresponder沒有得到功能。

+7

你有沒有考慮接受RSC的答案嗎?接受答案是什麼使這個地方工作,並被認爲是一個很好的做法。 –

+2

如果任何答案符合您的要求,請標記爲答案,以便其他人可以從中獲得幫助。 –

回答

65

這隻返回真正的部分告訴文本字段是否允許返回。您必須手動指定文本字段以關閉鍵盤(或其第一個響應者),然後通過致電resignFirstResponder()完成此操作。

func textFieldShouldReturn(textField: UITextField) -> Bool // called when 'return' key pressed. return false to ignore. 
{ 
    textField.resignFirstResponder() 
    return true 
} 
+2

謝謝......在我的情況「resignFirstResponder()」方法沒有得到自動,我認爲它不支持,但在手動編寫它的工作罰款..感謝,這是我尋找。 –

+0

@AshwinMangrulkar你可以預期,在Xcode 6的測試版本中,自動完成功能可能會受到阻礙。 –

+0

@ 0x7fffffff你能解釋一下「resignFirstResponder」的含義嗎?我已經閱讀了UIresponder的文檔,我不完全明白它是什麼。它似乎是用來「自由地關注特定UI元素」的模糊方法,這是在UITextField中自定義實現的。 –

252

可以使應用程序使用下面的函數

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     self.view.endEditing(true) 
     return false 
    } 

這裏取消鍵盤是一個完整的例子,以更好地說明:

// 
// ViewController.swift 
// 
// 

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet var myTextField : UITextField 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     self.myTextField.delegate = self; 
    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     self.view.endEditing(true) 
     return false 
    } 
} 

代碼來源:http://www.snip2code.com/Snippet/85930/swift-delegate-sample

+18

我錯過了「self.myTextField.delegate = self;」謝謝! – tylerlindell

+4

我錯過了'UITextFieldDelegate'! – Cesare

+0

@RSC能否向我解釋'self.myTextField.delegate = self'這一行。它的作品,但我真的不知道這裏發生了什麼(嘗試谷歌搜索,沒有任何成功) – jonnie

12

@RSC

對我來說,關鍵除了在Xcode 6.2版(6C86e)是override func viewDidLoad()

self.input.delegate = self; 

試圖得到它與幾個小時返回鍵工作到我發現您的文章,RSC。謝謝!

另外,如果你想,如果你摸別的地方在屏幕上隱藏鍵盤:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { self.view.endEditing(true); }

7

我會sugest從RSC初始化類:

import Foundation 
import UIKit 

// Don't forget the delegate! 
class ViewController: UIViewController, UITextFieldDelegate { 

required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

@IBOutlet var myTextField : UITextField? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    self.myTextField.delegate = self; 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func textFieldShouldReturn(textField: UITextField!) -> Bool { 
    self.view.endEditing(true); 
    return false; 
} 

}

9

爲了獲得自動鍵盤解除,我把這個代碼放在我的自定義文本字段類的方法之一中:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit) 

textField替代您的店鋪名稱。

+1

傑出。在我看來,這是最短和最好的選擇。特別是當你在另一個方法中創建文本字段時。就像在表格視圖標題中一樣。 – kakubei

40
  • 添加UITextFieldDelegate到類聲明:

    class ViewController: UIViewController, UITextFieldDelegate 
    
  • 連接textfield,或者編程寫

    @IBOutlet weak var userText: UITextField! 
    
  • 設置您的視圖控制器作爲文本字段代表鑑於沒有負載:

    override func viewDidLoad() { 
    super.viewDidLoad() 
    self.userText.delegate = self 
    } 
    
  • 添加的功能

    func textFieldShouldReturn(userText: UITextField!) -> Bool { 
        userText.resignFirstResponder() 
        return true; 
    } 
    

    這一切你的鍵盤將開始在文本框外面接觸藏漢通過按下返回鍵關閉。

+0

謝謝你!我錯過了這個:'UITextFieldDelegate' ...非常感謝! –

+0

出於某種原因,當我設置txtField.delegate = self時,我無法在該文本框內鍵入一次運行應用程序 –

+0

@JesusAdolfoRodriguez必須有一個原因落在該錯誤後面,此代碼不會導致任何問題。 :D快樂編碼! –

9

這樣做的另一種方式,也大多采用故事板,輕鬆地讓你有多個文本字段是:

@IBAction func resignKeyboard(sender: AnyObject) { 
    sender.resignFirstResponder() 
} 

連接所有文本爲視圖控制器到行動上Did End On Exit領域每個領域的事件。

+0

對不起,我正在嘗試在我的應用程序中使用這種方法,它似乎沒有工作。我在導航欄中有一個文本字段,並按照您的說明將它與該事件關聯起來,但它在運行時不起作用。 – wasimsandhu

+0

如果發件人的類型爲UIBarButtonItem,則會崩潰。如果我將添加工具欄添加到數字小鍵盤,那麼您的代碼必定會因發送到實例日誌的無法識別的選擇器而崩潰。 –

7

當用戶點擊文本鍵盤上的完成按鈕時,會產生一個結束退出事件;那時候,我們需要告訴文本字段放棄控制,這樣鍵盤就會消失。爲了做到這一點,我們需要在控制器類中添加一個動作方法。 選擇ViewController.swift添加以下操作方法:

@IBAction func textFieldDoneEditing(sender: UITextField) { 
sender.resignFirstResponder()} 

選擇Main.storyboard在Project Navigator和調出連接檢查。從Did End On Exit旁邊的圓圈拖動到故事板中的黃色View Controller圖標,然後鬆手。一個小的彈出式菜單將出現,其中包含一個動作的名稱,即我們剛剛添加的動作。點擊textFieldDoneEditing動作來選擇它,就是這樣。

1

確保您的文本字段委託設置爲從你在寫你的文本字段相關的代碼視圖控制器。

self.textField.delegate = self 
4

斯威夫特3

下面添加以下代碼到你的VC

//hide keyboard when user tapps on return key on the keyboard 
func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    self.view.endEditing(true); 
    return false; 
} 

適用於我

18

簡單斯威夫特3解決方案: 此功能添加到您的視圖控制器,配備了文本字段:

@IBAction func textField(_ sender: AnyObject) { 
    self.view.endEditing(true); 
} 

然後打開你的助理編輯,並保證雙方你Main.storyboard是對你的看法的一側,所需的視圖controller.swift文件在另一。點擊文本字段,然後從右側的實用程序面板中選擇「顯示連接檢查器」選項卡。在你的swift文件中控制從'退出結束'拖動到上面的函數。重複該場景中的任何其他文本字段並鏈接到相同的功能。

6

這裏的雨燕3.0更新peacetype的評論:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit) 
+0

這是一個乾淨的答案 – po5i

1

,你可以把這個地方,但不是在一個UIButton

func TextFieldEndEditing(text fiend name: UITextField!) -> Bool 
{ 
    return (false) 
} 

,那麼你可以把這個代碼在一個按鈕(也可用於例如):

self.view.endEditing(true) 

這個工作對我來說

2

斯威夫特

使用UITextFieldDelegate的可選功能。

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    return textField.endEditing(false) 
} 

false表示該字段可以要求辭職。 true - 強制辭職。

-1

在您正在使用的視圖控制器:

//suppose you are using the textfield label as this 

@IBOutlet weak var emailLabel: UITextField! 
@IBOutlet weak var passwordLabel: UITextField! 

//then your viewdidload should have the code like this 
override func viewDidLoad() { 
     super.viewDidLoad() 

     self.emailLabel.delegate = self 
     self.passwordLabel.delegate = self 

    } 

//then you should implement the func named textFieldShouldReturn 
func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     return true 
    } 

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too: 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.view.endEditing(true); 
    }