быстрое положение курсора с помощью смайликов - PullRequest
0 голосов
/ 03 декабря 2018

Стандартный метод, который я использую для определения положения курсора в поле UIText, похоже, не работает с некоторыми смайликами.Следующий код запрашивает у textField позицию курсора после вставки двух символов, сначала эмодзи, а затем буквенного символа.Когда emoji вставляется в 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

I 'Я пытаюсь использовать позицию курсора, чтобы разбить текстовую строку на две части - текст, который находится перед курсором, и текст, который следует после курсора.Для этого я использую позицию курсора в качестве индекса для массива символов, который я создал с помощью функции 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 голосов
/ 03 декабря 2018

Ваша проблема в том, что значение NSRange, возвращаемое UITextField 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...]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...