Ios UITextField不';单击按钮时结束编辑(委托文本字段编辑)

Ios UITextField不';单击按钮时结束编辑(委托文本字段编辑),ios,swift,delegates,uitextfield,swift2,Ios,Swift,Delegates,Uitextfield,Swift2,我在屏幕上有两个文本字段,还有一个提交按钮。用户在第一个文本字段和第二个文本字段中输入详细信息 我的要求是在单击Submit按钮时结束编辑,并在这些textFields中打印用户输入。我在打印第二个textField的值时遇到问题,因为当用户单击Submit按钮时,编辑似乎永远不会结束 这是我的密码。感谢您在这个问题上的帮助(我添加了textfield代表) 你这是什么意思 我在打印第二个文本字段的用户输入时遇到问题,因为 当用户单击提交时,编辑永远不会结束 为什么不在用户按submit时读取文

我在屏幕上有两个
文本字段
,还有一个
提交按钮
。用户在第一个文本字段和第二个文本字段中输入详细信息

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

这是我的密码。感谢您在这个问题上的帮助(我添加了textfield代表)

你这是什么意思

我在打印第二个文本字段的用户输入时遇到问题,因为 当用户单击提交时,编辑永远不会结束

为什么不在用户按submit时读取文本字段中的值呢?确保您的出口和代理是正确的

对您的按钮
内部进行润色
并在该按钮中读取值:

firstName = textFieldOne.text
lastName = textFieldTwo.text

ViewController
类中,通过Ctrl键将每个文本字段从情节提要拖到代码中,为每个文本字段创建@IBOutlet属性

@IBOutlet weak var textFieldFirst: UITextField!
@IBOutlet weak var textFieldSecond: UITextField!
还创建一个私有的
UITextField
属性来保存(可能)当前的(/最近使用的)文本字段

private var currentTextField: UITextField?
重写
UIViewController
子类的
viewDidLoad
方法,以初始化两个“公共”文本字段实例的委托

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(…)
textfieldDiBeginediting(…)
方法,分别将(活动)文本字段状态作为第一响应者退出,并更新
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
类应该如下所示

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

类ViewController:UIViewController、UIExtFieldDelegate{

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
    }

}

}

谢谢,但我试图避免连接每个文本字段的出口,因为上面的场景只是一个示例,而我实际尝试的是6个文本字段(如页面上的成员注册)。我真的不想将这6个文本字段连接到视图控制器。没有Cntrl+拖动出口和使用代理还有其他方法吗?感谢您的回答,但正如我刚才对上述答案所作的评论,我避免了Cntrl将文本字段拖动到视图控制器,因为在我的实际会员注册页面中有6个文本字段(我刚刚发布了一个示例版本,问题中有两个文本字段)我真的不想把插座连接到每一个插座上。如果有其他方法不连接插座,请告诉我,很多appreciated@Naishta:您确实需要一些可以与视图通信的
UITextView
实例;如果不需要,您的文本视图将“自行浮动”在视图空间中,与您的控制器没有联系。非常感谢您的详细解释,我将尝试您的建议并尽快接受答案/如果有,请更新您issues@Naishta:但是,一个选项是创建自己的
UIView
自定义子类,并用6个实例填充该类的单个实例
UITextField
:s。这样,您只需要从故事板->控制器(视图->控制器)中的一个出口;从自定义的
UIView
子类中的一个出口。您可以通过类接口访问6个
UITextField
实例(在自定义类实例中)(用于这些的正确方法)。这对
UITextField
学员来说会有点棘手,但肯定是一些开发swift编码的良好实践。这很有效。非常感谢这样的描述性回答,让我理解了这个问题。我将出口连接到文本字段,并检查最后一个文本字段以排除编辑,这就是我所做的寻找。太好了,当我陷入困境时,我不知道SO是如此强大:-)它很有效,而且在堆栈溢出时有一个新的面孔总是很好,但是请注意,您不应该为自己的问题添加答案(除非没有其他人找到并回答,并且您在这一点上成功地回答了自己的问题)。所以你应该删除这个答案。另一个注意事项:请注意,如果用户出于某种原因选择先输入他/她的密码,然后输入用户名,则上述实现将无法按预期工作(因此,在我的解决方案中,我添加了一个额外的私有文本字段var来保存最近编辑的文本字段)。只是一张便条:)
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
    }

}