单击按钮时 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
}
我在屏幕上有两个 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
}