首页 > 解决方案 > Swift 4 如何知道当 UITextField 成为第一响应者时按下了删除键?

问题描述

我已经找到了答案,都是关于使用shouldChangeCharactersInRangeUITextFieldDelegate 的功能。它适用于大多数情况。但是如果 UITextField 已经为空,shouldChangeCharactersInRange点击删除按钮时不再调用方法。任何帮助表示赞赏。

标签: uitextfielduitextfielddelegate

解决方案


这可以使用多种方法来完成(虽然不是直接的!)。一种是在其上放置一个不可见的按钮,或者通过子类UITextField化并将其添加为所需文本字段的自定义类。然后重写方法deleteBackward。此方法将捕获所有退格事件。

子类 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")
    }

}

推荐阅读