Swift 4 如何知道当UITextField成为第一响应者时按下了delete键?
Swift 4 how to know delete key is pressed when UITextField becomes first responder?
我搜索了答案,都是关于使用 UITextFieldDelegate 的 shouldChangeCharactersInRange
功能。它适用于大多数情况。但是,如果 UITextField 已经是空的,单击删除按钮时将不再调用 shouldChangeCharactersInRange
方法。任何帮助表示赞赏。
这可以使用多种方法来完成(虽然不是直接的!)。一种是在其上放置一个不可见的按钮,或者通过子classing UITextField
并将其添加为所需文本字段的自定义 class。然后覆盖方法deleteBackward
。此方法将捕获所有退格事件。
子class UITextField:
// MyTextField.swift
import UIKit
protocol MyTextFieldDelegate {
func textFieldDidDelete()
}
class MyTextField: UITextField {
var myDelegate: MyTextFieldDelegate?
override func deleteBackward() {
super.deleteBackward()
myDelegate?.textFieldDidDelete()
}
}
实施:
// ViewController.swift
import UIKit
class ViewController: UIViewController, MyTextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// initialize textField
let input = MyTextField(frame: CGRect(x: 50, y: 50, width: 150, height: 40))
// set viewController as "myDelegate"
input.myDelegate = self
// add textField to view
view.addSubview(input)
// focus the text field
input.becomeFirstResponder()
}
func textFieldDidDelete() {
print("delete")
}
}
我搜索了答案,都是关于使用 UITextFieldDelegate 的 shouldChangeCharactersInRange
功能。它适用于大多数情况。但是,如果 UITextField 已经是空的,单击删除按钮时将不再调用 shouldChangeCharactersInRange
方法。任何帮助表示赞赏。
这可以使用多种方法来完成(虽然不是直接的!)。一种是在其上放置一个不可见的按钮,或者通过子classing UITextField
并将其添加为所需文本字段的自定义 class。然后覆盖方法deleteBackward
。此方法将捕获所有退格事件。
子class UITextField:
// MyTextField.swift
import UIKit
protocol MyTextFieldDelegate {
func textFieldDidDelete()
}
class MyTextField: UITextField {
var myDelegate: MyTextFieldDelegate?
override func deleteBackward() {
super.deleteBackward()
myDelegate?.textFieldDidDelete()
}
}
实施:
// ViewController.swift
import UIKit
class ViewController: UIViewController, MyTextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// initialize textField
let input = MyTextField(frame: CGRect(x: 50, y: 50, width: 150, height: 40))
// set viewController as "myDelegate"
input.myDelegate = self
// add textField to view
view.addSubview(input)
// focus the text field
input.becomeFirstResponder()
}
func textFieldDidDelete() {
print("delete")
}
}