当我用表情符号替代它时,它崩溃了。斯威夫特iOS
当我输入像hello@amit这样的简单字符串时,这段代码运行良好。但当我使用带有@df的表情符号时,它会引发崩溃。在子串中崩溃。当我通过简单文本中的子字符串获取文本时,它工作得很好,但使用表情符号会导致崩溃当我用表情符号替代它时,它崩溃了。斯威夫特iOS,ios,swift,Ios,Swift,当我输入像hello@amit这样的简单字符串时,这段代码运行良好。但当我使用带有@df的表情符号时,它会引发崩溃。在子串中崩溃。当我通过简单文本中的子字符串获取文本时,它工作得很好,但使用表情符号会导致崩溃 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text:String) -> Bool { //var mentionStartPosition
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text:String) -> Bool {
//var mentionStartPosition : Int = 0
//var isContainMention : Bool = false
//WHEN USER TYPE TEXT COMPLETE TEXT ADD NEW CHAR IN COMPLETETEXT
let completeText = textView.text + text
// CHECK char FOR IF USER PRESS BACKSPACE OR NOT
//ENNCODE THE CURRENT TEXT
if let char = text.cString(using: String.Encoding.utf8) {
//GET THE VALUE UNICODE
let isBackSpace = strcmp(char, "\\b")
//BACKSPACE PRESSED
if (isBackSpace == -92) {
if let selectedRange = textView.selectedTextRange {
let cursorPosition = textView.offset(from: textView.beginningOfDocument, to: selectedRange.end)
if mentionStartPosition < cursorPosition {
let textBetween = completeText.substring(Range(mentionStartPosition ... cursorPosition))
if textBetween.contains("@") {
isContainMention = true
} else {
isContainMention = false
}
} else {
isContainMention = false
}
}
}
}
if text.contains("@") {
isContainMention = true
searchText += text
return true
} else if isContainMention {
if let char = text.cString(using: String.Encoding.utf8) {
let isBackSpace = strcmp(char, "\\b")
if (isBackSpace == -92) {
if searchText.count > 0 {
searchText.removeLast()
if searchText.isEmpty {
isContainMention = false
searchText = ""
}
} else {
return true
}
}
}
if let selectedRange = textView.selectedTextRange {
let whitespace = NSCharacterSet.whitespaces
let range = text.rangeOfCharacter(from: whitespace, options: .regularExpression, range: nil)
let cursorPosition = textView.offset(from: textView.beginningOfDocument, to: selectedRange.start)
let textBetween = completeText.substring(Range(mentionStartPosition ... cursorPosition))
if textBetween.contains("@") {
let from = completeText.substring(from: cursorPosition)
if cursorPosition != 1 {
let beforeText = completeText.substring(from: cursorPosition - 1)
if beforeText == "@" {
isContainMention = false
searchText = ""
return true
}
}
searchText += from
}
else {
isContainMention = false
searchText = ""
}
}
return true
}
}
func substring(_ r: Range<Int>) -> String {
let fromIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
let toIndex = self.index(self.startIndex, offsetBy: r.upperBound - 1)
let indexRange = Range<String.Index>(uncheckedBounds: (lower: fromIndex, upper:toIndex))
return String(self[indexRange])
}
func textView(textView:UITextView,shouldChangeTextIn范围:NSRange,replacementText:String)->Bool{
//var INTENTSTARTPOSITION:Int=0
//var iscontainention:Bool=false
//当用户键入TEXT COMPLETE TEXT时,在COMPLETETEXT中添加新字符
让completeText=textView.text+text
//检查用户是否按BACKSPACE键的字符
//对当前文本重新编码
如果let char=text.cString(使用:String.Encoding.utf8){
//获取UNICODE的值
让isBackSpace=strcmp(字符“\\b”)
//退格按下
如果(isBackSpace==-92){
如果让selectedRange=textView.selectedTextRange{
让cursorPosition=textView.offset(从:textView.BeginingOfDocument到:selectedRange.end)
如果提到StartPosition0{
searchText.removeLast()
如果searchText.i为空{
isContainention=false
searchText=“”
}
}否则{
返回真值
}
}
}
如果让selectedRange=textView.selectedTextRange{
让空白=NSCharacterSet.whitespaces
让range=text.rangeOfCharacter(from:whitespace,options:.regularExpression,range:nil)
让cursorPosition=textView.offset(从:textView.BeginingOfDocument到:selectedRange.start)
设textBetween=completeText.substring(范围(提及StartPosition…光标位置))
如果textBetween.contains(“@”){
let from=completeText.substring(from:cursorPosition)
如果光标位置!=1{
let beforeText=completeText.substring(from:cursorPosition-1)
如果beforeText==“@”{
isContainention=false
searchText=“”
返回真值
}
}
searchText+=来自
}
否则{
isContainention=false
searchText=“”
}
}
返回真值
}
}
func子字符串(r:Range)->字符串{
let fromIndex=self.index(self.startIndex,抵销方:r.lowerBound)
设toIndex=self.index(self.startIndex,offsetBy:r.upperBound-1)
设indexRange=Range(未选中边界:(下:fromIndex,上:toIndex))
返回字符串(self[indexRange])
}
哪行代码崩溃?控制台中是否打印了任何内容?offset方法返回utf16距离。您需要构造一个NSRange并从中创建一个字符串范围。@aheze崩溃在子字符串方法上,让textBetween=completeText.substring(范围(提及StartPosition…cursorPosition))假设我输入