如何从 UITextField 中的外部键盘检测“命令+退格”

Posted

技术标签:

【中文标题】如何从 UITextField 中的外部键盘检测“命令+退格”【英文标题】:How do I detect a "command + backspace" from an external keyboard in a UITextField 【发布时间】:2019-01-15 20:05:41 【问题描述】:

我正在使用旧的添加零长度字符解决方案来检测空文本字段中的退格 (Detect backspace Event in UITextField)。

不幸的是,在 iPad 上,如果您连接外部键盘并点击“cmd+backspace”,它不会触发 shouldChangeCharactersInRange 方法。

我查看了文档和decompiled headers,但似乎无法找到防止这种情况发生的方法。

那么,如何检测“命令+退格事件”?

【问题讨论】:

【参考方案1】:

您可以使用UIKeyCommand。我使用蓝牙键盘和 Swift Playgrounds 应用程序 2.2 版在运行 ios 12.1.1 的 10.5 英寸 iPad Pro 上进行了测试。

这是操场代码:

import UIKit
import PlaygroundSupport

class ViewController: UIViewController 
    override func loadView() 
        let command = UIKeyCommand(input: "\u8", modifierFlags: .command, action: #selector(ViewController.handleKeyCommand), discoverabilityTitle: "Hello")
        addKeyCommand(command)

        let view = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
        view.contentMode = .topLeft
        view.backgroundColor = .white

        let stack = UIStackView()
        stack.axis = .vertical
        stack.spacing = 8
        stack.alignment = .fill
        stack.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(stack)
        NSLayoutConstraint.activate([
            view.leadingAnchor.constraint(equalTo: stack.leadingAnchor),
            view.trailingAnchor.constraint(equalTo: stack.trailingAnchor),
            view.topAnchor.constraint(equalTo: stack.topAnchor)])

        let textField = UITextField(frame: CGRect(x: 20, y: 20, width: 260, height: 30))
        textField.borderStyle = .roundedRect
        textField.translatesAutoresizingMaskIntoConstraints = false
        stack.addArrangedSubview(textField)

        label.translatesAutoresizingMaskIntoConstraints = false
        stack.addArrangedSubview(label)

        self.view = view
    

    @objc func handleKeyCommand(_ sender: UIKeyCommand) 
        commandCount += 1
        label.text = "\(commandCount)"
    

    private var commandCount = 0
    private let label = UILabel()


let vc = ViewController()
PlaygroundPage.current.liveView = vc

点击文本字段,然后按 ⌘⌫。每按一次,标签中的计数就会增加 1。

【讨论】:

以上是关于如何从 UITextField 中的外部键盘检测“命令+退格”的主要内容,如果未能解决你的问题,请参考以下文章

UITextField - 检测内置 iPhone 键盘上的输入?

检测 UITextField 的焦点变化

检测UITextField的焦点更改

如何测试键盘是不是覆盖 UITableView 中的 UITextField?

当用户在 iPhone App 的 UITextField 中输入值时,如何显示特定语言键盘?

如何使键盘 UITextField 中的数字视图成为默认值?