使用表情符号快速移动光标位置

时间:2018-12-03 01:52:59

标签: swift string emoji cursor-position

我用来获取UITextfield中光标位置的标准方法似乎不适用于某些表情符号。以下代码在插入两个字符(首先是表情符号,然后是字母字符)后查询textField的光标位置。将表情符号插入到textField中后,该函数将为光标位置返回2值,而不是预期结果1。任何关于我做错了或如何纠正此问题的想法。谢谢

这是来自xcode游乐场的代码:

class MyViewController : UIViewController {

override func loadView() {
    //setup view
    let view = UIView()
    view.backgroundColor = .white
    let textField = UITextField()
    textField.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
    textField.textColor = .black
    view.addSubview(textField)
    self.view = view

    //check cursor position
    var str = ""
    textField.insertText(str)
    print("cursor position after '\(str)' insertion is \(getCursorPosition(textField))")

    textField.text = ""
    str = "A"
    textField.insertText(str)
     print("cursor position after '\(str)' insertion is \(getCursorPosition(textField))")
}

func getCursorPosition(_ textField: UITextField) -> Int {
    if let selectedRange = textField.selectedTextRange {
        let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.end)
        return cursorPosition
    }
    return -1
}

}

代码返回以下输出:

cursor position after '' insertion is 2
cursor position after 'A' insertion is 1

我正在尝试使用光标位置将文本字符串分成两部分-光标之前的文本和光标之后的文本。为此,我将光标位置用作使用map函数创建的字符数组的索引,如下所示。光标位置导致带有表情符号的数组索引错误

    var textBeforeCursor = String()
    var textAfterCursor = String()
    let array = textField.text!.map { String($0) }
    let cursorPosition = getCursorPosition(textField)
    for index in 0..<cursorPosition {
        textBeforeCursor += array[index]
    }

1 个答案:

答案 0 :(得分:3)

您的问题是NSRangeUITextField selectedTextRange返回的offset值需要正确转换为Swift String.Index

func getCursorPosition(_ textField: UITextField) -> String.Index? {
    if let selectedRange = textField.selectedTextRange {
        let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.end)
        let positionRange = NSRange(location: 0, length: cursorPosition)
        let stringOffset = Range(positionRange, in: textField.text!)!

        return stringOffset.upperBound
    }

    return nil
}

一旦有了String.Index,就可以分割字符串。

if let index = getCursorPosition(textField) {
    let textBeforeCursor = textField.text![..<index]
    let textAfterCursor = textField.text![index...]
}