Я использую функцию textView(_: shouldChangeTextIn: replacementText:)
для изменения входных данных в зависимости от ситуации. Я использую диапазон, но не могу получить диапазон Swift при использовании символьных символов Юникода (например, ( ͡° ͜ʖ ͡°)). Подскажите, пожалуйста, как это можно сделать?
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
( ͡° ͜ʖ ͡????????°)༼ つ ͡° ͜ʖ ͡????° ༽つ
Потом я начал удалять символы справа налево после того как три правых нескольких символа были удалены ° ༽つ
, а эмодзи ???? автомобиль ушел, то я не могу получить диапазон, так как поставил охрану и приложение не вылетает , если я удалю это, конечно, произойдет сбой приложения.
Полный код
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}
let newRange = Range(range, in: textView.text)!
и заданной начальной строкой и смог удалить все символы справа без сбоев. - person Martin R   schedule 07.06.2018