当我用表情符号替代它时,它崩溃了。斯威夫特iOS

当我用表情符号替代它时,它崩溃了。斯威夫特iOS,ios,swift,Ios,Swift,当我输入像hello@amit这样的简单字符串时,这段代码运行良好。但当我使用带有@df的表情符号时,它会引发崩溃。在子串中崩溃。当我通过简单文本中的子字符串获取文本时,它工作得很好,但使用表情符号会导致崩溃 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text:String) -> Bool { //var mentionStartPosition

当我输入像hello@amit这样的简单字符串时,这段代码运行良好。但当我使用带有@df的表情符号时,它会引发崩溃。在子串中崩溃。当我通过简单文本中的子字符串获取文本时,它工作得很好,但使用表情符号会导致崩溃

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))假设我输入