概述
今天项目中遇到一个需求:UITextField中文本为空时,仍然能够监听到键盘的删除按键点击事件
分析
当UITextField中文本不为空时,可以通过以下方式实现
textField.addTarget(self, action: #selector(textDidChanged(_:)), for: UIControlEvents.editingChanged)
但是,当UITextField中文本为空时,textDidChanged(_:)
不会被触发,因此需要其他的方式
查看UITextField API可以发现如下的系统事件
public protocol UIKeyInput : UITextInputTraits {
public var hasText: Bool { get }
public func insertText(_ text: String)
public func deleteBackward()
}
现在要做的就是实现该协议,收到deleteBackward()
回调函数
然而该协议已经被UITextField实现了,只是没有抛出来
@available(iOS 2.0, *)
open class UITextField : UIControl, UITextInput, NSCoding, UIContentSizeCategoryAdjusting
现在要做的就是从UITextField中抛出该函数
解决方案
自定义一个子类,继承UITextField
import UIKit
protocol CustomTextFieldDelegate {
func textFieldBackKeyPressed(_ textField:UITextField)
}
class CustomTextField: UITextField {
var customTextFieldDelegate:CustomTextFieldDelegate?
override func deleteBackward() {
super.deleteBackward()
if customTextFieldDelegate != nil {
customTextFieldDelegate?.textFieldBackKeyPressed(self)
}
}
}
实际使用时
import UIKit
class ControlPadTextInput: UIView, CustomTextFieldDelegate{
private var inputRegion:CustomTextField!
override init(frame: CGRect) {
super.init(frame: frame)
inputRegion = CustomTextField.init(frame: CGRect(x: MARGIN_21_HOR, y: 0, width: DPAD_WIDTH - MARGIN_21_HOR*2, height: SIZE_32_HEIGHT))
inputRegion.customTextFieldDelegate = self
//... ...
}
func textFieldBackKeyPressed(_ textField: TextField) {
//do something
}
}