私はUITextfied
を使ってtextfiedキーボードをクリックしていますが、私が押したとき return キー、キーボードは消えていません。私は以下のコードを使いました。
func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
return true;
}
メソッドresignfirstresponderが機能していません。
次の機能を使用して、アプリにキーボードを無効にさせることができます。
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
このreturn true
の部分は、テキストフィールドに返すことが許可されているかどうかを伝えるだけです。
あなたは手動でキーボードを消すようにテキストフィールドに指示しなければなりません(あるいはその最初の応答者が何であるか)、そしてこれは以下のようにresignFirstResponder()
で行われます:
// Called on 'Return' pressed. Return false to ignore.
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
クラス宣言にUITextFieldDelegate
を追加します。
class ViewController: UIViewController, UITextFieldDelegate
textfield
を接続するか、プログラム的に書いてください
@IBOutlet weak var userText: UITextField!
ビューのテキストフィールドデリゲートがロードされたときにView Controllerを設定します。
override func viewDidLoad() {
super.viewDidLoad()
self.userText.delegate = self
}
以下の機能を追加
func textFieldShouldReturn(userText: UITextField!) -> Bool {
userText.resignFirstResponder()
return true;
}
これだけでは、キーボードはテキストフィールドの外側をタッチするだけでなくリターンキーを押すことで消え始めます。
Simple Swift 3 Solution:テキストフィールドを特徴とするView Controllerにこの機能を追加してください。
@IBAction func textField(_ sender: AnyObject) {
self.view.endEditing(true);
}
次に、アシスタントエディタを開き、Main.storyboardがビューの一方の側にあり、目的のView Controller.Swiftファイルがもう一方の側にあることを確認します。テキストフィールドをクリックして、右側のユーティリティパネルの[Show the Connection Inspector]タブを選択します。 Swiftファイルの '終了時の終了位置'から上記の機能へのドラッグを制御します。そのシーン内の他のテキストフィールドについても同じ手順を繰り返し、同じ機能にリンクします。
@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); }
キーボードを自動的に閉じるために、このテキストをカスタムテキストフィールドのクラスのメソッドの1つの中に置きます。
textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)
アウトレットの名前をtextField
に置き換えます。
これを行うもう1つの方法は、主にストーリーボードを使用し、簡単に複数のテキストフィールドを使用できるようにすることです。
@IBAction func resignKeyboard(sender: AnyObject) {
sender.resignFirstResponder()
}
そのビューコントローラのすべてのテキストフィールドを、各フィールドのDid End On Exit
イベントに対するそのアクションに接続します。
" Primary Action Triggered "のUITextFieldからアクションアウトレットを作成し、渡された送信者パラメータでファーストレスポンダを辞退することができます。
@IBAction func done(_ sender: UITextField) {
sender.resignFirstResponder()
}
超簡単です。
(Scott Smithの60秒のビデオで、この点について教えてくれてありがとう: https://youtu.be/v6GrnVQy7iA )
ユーザーがテキストキーボードの[完了]ボタンをタップすると、[終了時に終了]イベントが生成されます。そのときは、キーボードが消えるようにテキストフィールドに制御を放棄するように指示する必要があります。そのためには、コントローラクラスにアクションメソッドを追加する必要があります。 ViewController.Swiftを選択して、次のアクションメソッドを追加します。
@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}
プロジェクトナビゲータでMain.storyboardを選択して、接続インスペクタを起動します。 [終了時に終了しました]の横にある円からストーリーボードの黄色のView Controllerアイコンまでドラッグして、放します。追加したばかりのアクションの名前を含む小さなポップアップメニューが表示されます。 textFieldDoneEditingアクションをクリックして選択し、それで終わりです。
SRCからクラスを開始することをお勧めします。
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;
}
}
これがpeacetypeのコメントに対するSwift 3.0の更新です。
textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)
スイフト3
このコードをあなたのVCに追加してください
//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true);
return false;
}
私のために働く
UITextFieldDelegate
からのオプション関数の使用.
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
return textField.endEditing(false)
}
false
は、フィールドに辞任を要求できることを意味します。 true
- 辞任を強制します。
あなたはこれをUIButtonではなくどこにでも置くことができます
func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
return (false)
}
それからあなたはボタンにこのコードを入れることができます(これもまた例えば):
self.view.endEditing(true)
これは私のために働いた
すべてのUIViewControllerに同じ関数を追加するのは嫌です。 UIViewFieldDelegateをサポートするようにUIViewControllerを拡張することにより、「Return Press」のデフォルトの動作を提供できます。
extension UIViewController: UITextFieldDelegate{
public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true;
}
}
新しいUIViewControllerとUITextFieldを作成するときは、UIViewControllerに1行のコードを記述するだけです。
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
Main.storyboardでデリゲートをフックすることにより、この1行のコードを省略することもできます。 (「ctrl」を使用し、UITextFieldからUIViewControllerにドラッグ)
TextFieldデリゲートが、textfield関連のコードを書いているビューコントローラに設定されていることを確認してください。
self.textField.delegate = self
使用しているView Controllerで、
//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);
}
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
self.view.addGestureRecognizer(tap)}
それからあなたはこの機能を使う
func handleScreenTap(sender: UITapGestureRecognizer) {
self.view.endEditing(true)
}