首页 文章

无法从iOS中的UITextView中删除已删除的字符

提问于
浏览
1

当用户按下键盘上的删除按钮时,我试图从UITextView中检索已删除的字符 .

当我在textview中为例如:(abc)输入一些文本时,我可以通过检查范围和位置来检索已删除的字符 . 所以英文文本没问题

当我有非英语文本时,挑战就开始了,例如“印地语” .

假设我在textview中输入了“परक”,然后如果我从右到左一次删除一个字符,我就能分别将删除的字符识别为क,र,प .

当我在字符串中有印地语元音时,真正的问题就开始了

例如:如果我的文字为“परी” . 然后根据印地语文本它包含三个字符प,र,ी . 这里有一个印地语长元音

当我在textview中输入ी时,委托方法能够识别此文本 .

然而,当我按下键盘上的删除按钮从单词“परी”中删除ी时,确定删除哪个单词的范围计算似乎出错了 . 我得到范围值删除ी为

范围(3 .. <3) - startIndex:3 - endIndex:3

由于startIndex和endIndex相同,我得到一个空字符串 .

以下是我用于在textview中输入或删除字符的代码

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if ( range.location == 0 && text == " " )
    {
        return false
    }

    // Its backspace
    if text == ""
    {
        // Set startIndex for Range
        let startIndex = textView.text.startIndex.advancedBy(range.location, limit: textView.text.endIndex)

        // Set new Range
        let newRange = startIndex..<textView.text.startIndex.advancedBy(range.location + range.length, limit: textView.text.endIndex)

        // Get substring
        // Here I get the character that is about to be deleted
        let substring = textView.text[newRange]

        print(substring) //Gives empty string when i delete  ी

        return true
    }

    print(text) // This prints  ी when i enter it in textview  after पर
    return true
}

如果有人能帮助我,那将是很棒的 . 我已经检查过Android,它可以在删除时识别ी . 好奇地等待回复....

注意:代码是用Swift 2.3编写的

1 回答

  • 2

    当我在 UITextView 中删除了 "परी" 的最后一个字符时,我在委托方法中得到了 NSRange(location: 2, length: 1) . 它不是空的,如你所见,它的长度不是0 .

    问题是你检索 substring 的代码是完全错误的 .

    当iOS API为字符串相关操作返回 NSRange 时,其 locationlength 基于UTF-16,这是 NSString 的基础 . 您不应将这些值用于基于 charactersString.CharacterView )的索引计算 .

    替换代码的这些行:

    // Set startIndex for Range
        let startIndex = textView.text.startIndex.advancedBy(range.location, limit: textView.text.endIndex)
    
        // Set new Range
        let newRange = startIndex..<textView.text.startIndex.advancedBy(range.location + range.length, limit: textView.text.endIndex)
    
        // Get substring
        // Here I get the character that is about to be deleted
        let substring = textView.text[newRange]
    

    至:

    //### Get substring
            let substring = (textView.text as NSString).substringWithRange(range)
    

    您的代码似乎是用Swift 2编写的,但在Swift 3中,它变为:

    //### Get substring
            let substring = (textView.text as NSString).substring(with: range)
    

相关问题