Стандартный метод, который я использую для определения положения курсора в поле 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]
}