如何在自定义键盘按钮中实现功能齐全的退格键 swift

How to implement a fully functional backspace key in custom keyboard button swift

如何为 iOS 中的自定义键盘实现自定义 backspace/delete 按钮以响应 swift 中的 UITextField 委托?

我为此苦苦挣扎了一段时间,所以我想我会回答这个问题。以下代码响应在作为 UITextfield 的第一响应者的 uikeyboard 上按下的自定义退格键:

// the tag for the backspace button
if tag == "<"{
        //the range of the selected text (handles multiple highlighted characters of a uitextfield)
        let range = textField.selectedTextRange?;

        // if the range is empty indicating the cursor position is 
        // singular (no multiple characters are highlighted) then delete the character 
        // in the position before the cursor
        if range!.empty {

            let start = textField.positionFromPosition(range!.start, offset: -1);
            let end = axiomBuilderTV.positionFromPosition(range!.end, offset: 0);
            axiomBuilderTV.replaceRange(axiomBuilderTV.textRangeFromPosition(start, toPosition: end), withText: "");
        }
        // multiple characters have been highlighted so remove them all
        else {
            textField.replaceRange(range!, withText: "");
        }

    }

您可能会发现全局方法 "droplast()" 很有帮助。(还有一个 "dropfirst")

var stringToBeBackspace = "abcde"
dropLast(stringToBeBackspace)    //.swift

字符串实际上是字符的集合,所以你也可以在字符串中做滑动字符,你会发现"countElements"会有很大的帮助。

我现在这个问题早就得到了回答,但我想分享我基于 UIKeyInput 的方法(在 iOS9 和 Xcode 7- Swift 2 上测试)。

    @IBAction func backspacePressed(btn: UIButton) {
        if btn.tag == 101 {

            (textDocumentProxy as UIKeyInput).deleteBackward()
        }
    }

Swift 3.0.1

此答案对 backspace/delete 按钮有反应,但具有限制可输入文本字段的最大字符数的额外功能。因此,如果 textField 包含的字符数超过最大数量,因为以编程方式插入到 textField 中的字符串不能添加字符,但可以删除它们,因为 'range.length' returns 1 只能使用删除键。

感谢 OOPer 提供限制字符数的原始代码。 https://forums.developer.apple.com/thread/14627

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // Updates everytime character ie typed or deleted until Max set in textFieldLimit
    let textFieldLimit = 30
    if (range.length == 1) { // Delete button = 1 all others = 0
        return true
    } else {
        return (textField.text?.utf16.count ?? 0) + string.utf16.count - range.length <= textFieldLimit
    }
}