我用
textView(_: shouldChangeTextIn: replacementText:)
函数根据情况更改输入数据。我使用范围,但在使用Unicode字符符号(例如
(2055年)
)拜托,告诉我怎么做?
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
}
Example project
应用程序崩溃示例
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
:我在文本视图中输入了这些字符
( ͡° ÍÊ Í¡ðºð¸Â°)༼ 㤠͡° ÍÊ Í¡ð° ༽ã¤
然后我开始删除字符,在删除三个右边的几个符号后,从右向左
° ༽ã¤
,而车的表情符号已经离开,那么我就无法得到范围,因为我把卫士和应用程序不崩溃,如果我删除了那当然会有应用程序崩溃。
全码
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}