Я использую функцию textView(_: shouldChangeTextIn: replacementText:)
для изменения входных данных в зависимости от ситуации.Я использую диапазон, но не могу получить Swift Range при использовании символов символов Юникода (например, (͡ ° ͜ʖ ͡ °) ).Скажите, пожалуйста, как это можно сделать?
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let maxLenthNotReached = textView.text.count + (text.count - range.length) <= maxTextLength
if maxLenthNotReached {
guard let newRange = Range(range, in: identityString) else { return false }
identityString = identityString.replacingCharacters(in: newRange, with: text)
}
return maxLenthNotReached
}
Пример проекта
Пример сбоя приложения http://take.ms/ojIJq
Обновление: я изменил этот метод, но у меня снова произошел сбой при удалении
"entering data" ""
"testString" "༼ つ ͡° ͜ʖ?? ͡° ༽つ( ͡° ͜ʖ? ͡"
"entering data" ""
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
debugPrint("textView.text", textView.text)
testString = textView.text.replacingCharacters(in: Range(range, in: textView.text)!, with: text)//
debugPrint("testString", testString)
return true
}
Обновление 1 : я ввел эти символы в textView
( ͡° ͜ʖ ͡??°)༼ つ ͡° ͜ʖ ͡?° ༽つ
Затем я начал удалять символы справа налево после того, как три правых символа были удалены ° ༽つ
, и ? car emoji ушло, тогда я не могу получить диапазон, так как я установил охрану, а приложение неЕсли я удаляю это, конечно, произойдет сбой приложения.
Полный код
class ViewController: UIViewController {
// MARK: - IBOutlets
@IBOutlet private weak var textView: UITextView! {
didSet {
textView.delegate = self
textView.text = "( ͡° ͜ʖ ͡??°)༼ つ ͡° ͜ʖ ͡?° ༽つ"
}
}
// MARK: - Properties
private var testString = ""
}
extension ViewController: UITextViewDelegate {
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
guard let newRange = Range(range, in: textView.text) else {
return false
}
testString = textView.text.replacingCharacters(in: newRange, with: text)
return true
}
}
Обновление 2 : После разговора с Мартином я нашел и предоставилодна деталь, что эта проблема возникает только с клавиатурой Google, и с клавиатурой по умолчанию все работает как положено.
Исходная строка, которую я имел, была "( ͡° ͜ʖ ͡??°)༼ つ ͡° ͜ʖ ͡?° ༽つ”
, эта строка используется для примера. Если я начинаю удалениеэта строка слева направо, я получаю сбой приложения,Мартин попросил показать последние данные в консоли до сбоя приложения, последняя печать перед сбоем - textView" "( ͡° ͜ʖ ͡??°)༼ つ ͡° ͜ʖ ͡?" "range" {27, 1}