我使用textView(_: shouldChangeTextIn: replacementText:)
函数来根据情况更改输入数据。我使用range,但是在使用unicode字符符号(例如( ͡° ͜ʖ ͡°))时无法获取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:在与Martin交谈后,我发现并提供了一个细节,即这个问题只会在使用Google键盘时出现,而在默认键盘下,一切正常。
我原本的文本是"( ͡° ͜ʖ ͡°)༼ つ ͡° ͜ʖ ͡° ༽つ”
,这个文本只是用来举例说明。如果我从左向右开始删除这个文本,应用程序就会崩溃。Martin要求在应用程序崩溃之前在控制台中显示最新数据,崩溃前的最后一次打印是textView" "( ͡° ͜ʖ ͡°)༼ つ ͡° ͜ʖ ͡" "range" {27, 1}