单击按钮时 UITextField 不会结束编辑(委托 textFieldDidEndEditing)

UITextField doesn't end editing when Button clicked( delegate textFieldDidEndEditing )

我在屏幕上有两个 textFields 和一个 Submit button。用户在第一个文本字段中输入详细信息,然后在第二个文本字段中输入详细信息。

我的要求是在单击 Submit button 时结束编辑并打印这些 textFields 中的用户输入。我在打印第二个文本字段的值时遇到问题,因为编辑似乎永远不会结束当用户点击 Submit button.

这是我的代码。感谢您在此问题上的帮助(我添加了文本字段委托)

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    var firstName = ""
    var lastName = ""

    @IBOutlet var buttonUI: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func Submit(sender: UIButton) {

        print(firstName)
        print(lastName)

    }

    func textFieldDidEndEditing(textField: UITextField) {

        switch textField.tag {

        case 1:
              firstName = textField.text!
            print(firstName)
        case 2:

            lastName = textField.text!
            print(lastName)

        default: break
        }

    }


}

你说的

是什么意思

I am having issues printing the 2nd textfield's user inputs, as the editing never gets ended when user clicks the Submit.

为什么不在用户按下提交时读取文本字段中的值?确保您的网点和代表是正确的。

对您的按钮进行操作 Touch up inside,您将在该按钮中读取以下值:

firstName = textFieldOne.text
lastName = textFieldTwo.text

在您的 ViewController class 中,为每个文本字段创建一个 @IBOutlet 属性,方法是按住 Ctrl 键将每个文本字段从故事板拖到您的代码中

@IBOutlet weak var textFieldFirst: UITextField!
@IBOutlet weak var textFieldSecond: UITextField!

同时创建一个私有 UITextField 属性 来保存(可能)当前(/最近使用的)文本字段。

private var currentTextField: UITextField?

覆盖 UIViewController subclass 的 viewDidLoad 方法以初始化两个 "public" 文本字段实例的委托

override func viewDidLoad() {
    super.viewDidLoad()

    // Handle the user input in the text fields through delegate callbacks (and set tags)
    textFieldFirst.delegate = self
    textFieldFirst.tag = 1
    textFieldSecond.delegate = self
    textFieldSecond.tag = 2
}

此外,使用 UITextFieldDelegate 的两个 textFieldShouldReturn(...)textFieldDidBeginEditing(...) 方法将(活动的)文本字段状态作为第一响应者并更新 currentTextField分别参考。

// UITextFieldDelegate
func textFieldShouldReturn(textField: UITextField) -> Bool {
    // User finished typing (hit return): hide the keyboard.
    textField.resignFirstResponder()
    return true
}

func textFieldDidBeginEditing(textField: UITextField) {
    currentTextField = textField
}

最后,退出任何可能的当前文本字段作为第一响应者,以防在编辑过程中按下 submit

@IBAction func Submit(sender: UIButton) {
    if let currentTextField = currentTextField {
        currentTextField.resignFirstResponder()
    }
    print(firstName)
    print(lastName)
}

有了这个,您的视图控制器应该可以按预期工作。


总结一下:经过上面的添加和修改后,您的 ViewController class 应该看起来像

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    // Properties
    @IBOutlet weak var textFieldFirst: UITextField!
    @IBOutlet weak var textFieldSecond: UITextField!
    private var currentTextField: UITextField?
    var firstName = ""
    var lastName = ""

    @IBOutlet var buttonUI: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // Actions
    @IBAction func Submit(sender: UIButton) {
        if let currentTextField = currentTextField {
            currentTextField.resignFirstResponder()
        }
        print(firstName)
        print(lastName)
    }

    // viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()

        // handle the user input in the text fields through delegate callbacks
        textFieldFirst.delegate = self
        textFieldSecond.delegate = self

        // tags
        textFieldFirst.tag = 1
        textFieldSecond.tag = 2
    }

    // UITextFieldDelegate
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        // User finished typing (hit return): hide the keyboard.
        textField.resignFirstResponder()
        return true
    }

    func textFieldDidBeginEditing(textField: UITextField) {
        currentTextField = textField
    }

    func textFieldDidEndEditing(textField: UITextField) {
        switch textField.tag {
        case 1:
            firstName = textField.text!
            print(firstName)
        case 2:
            lastName = textField.text!
            print(lastName)
        default: break
        }
    }
}

实施了@dfri 的有效建议!!!

导入 UIKit

class ViewController: UIViewController, UITextFieldDelegate {

var firstName = ""
var lastName = ""

@IBOutlet var NameTextField: UITextField!
@IBOutlet var PasswordTextField: UITextField!

@IBOutlet var buttonUI: UIButton!
override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func Submit(sender: UIButton) {

    PasswordTextField.resignFirstResponder() // this works and dismisses the editing ( outlets need to be connected aswell for the textfields)
    print(firstName)
    print(lastName)

}

func textFieldDidEndEditing(textField: UITextField) {

    switch textField.tag {

    case 1:
          firstName = textField.text!
        print(firstName)
    case 2:

        lastName = textField.text!
        print(lastName)

    default: break
    }

}

}

如果还有人需要的话。 您可以添加

view.endEditing(true) 

在单元格外的按钮内

并将其添加到您的 tableviewCell 中

func textFieldShouldReturn(textField: UITextField) -> Bool {
        // User finished typing (hit return): hide the keyboard.
        textField.resignFirstResponder()
        return true
}