iOS UITextField监听键盘删除按键

概述

今天项目中遇到一个需求: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
    }

}

参考

  1. iOS监听键盘的删除按键事件

你可能感兴趣的:(iOS UITextField监听键盘删除按键)