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

Nai*_*hta 5 delegates uitextfield ios swift swift2

textFields在屏幕上有两个和一个Submit button.用户在第一个textField输入详细信息,然后输入第二个.

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

这是我的代码.感谢您对此问题的帮助(我添加了textfield委托)

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
        }

    }


}
Run Code Online (Sandbox Code Playgroud)

dfr*_*fri 14

在您的ViewController班级中,对于每个文本字段,通过按住Ctrl键将每个文本字段从故事板拖到您的代码中来创建一个@IBOutlet属性

@IBOutlet weak var textFieldFirst: UITextField!
@IBOutlet weak var textFieldSecond: UITextField!
Run Code Online (Sandbox Code Playgroud)

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

private var currentTextField: UITextField?
Run Code Online (Sandbox Code Playgroud)

重写子类的viewDidLoad方法UIViewController以初始化两个"公共"文本字段实例的委托

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
}
Run Code Online (Sandbox Code Playgroud)

此外,使用两者textFieldShouldReturn(...)textFieldDidBeginEditing(...)方法UITextFieldDelegate将(活动)文本字段状态作为第一响应者重新分配并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
}
Run Code Online (Sandbox Code Playgroud)

最后,将任何可能的当前文本字段作为第一响应者重新签名,以防submit在编辑中间按下

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

这样,您的视图控制器应该按预期工作.


总结一下:在上面的添加和修改之后,你的ViewController课应该是这样的

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)