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

时间:2017-02-09 15:25:20

标签: ios swift range uitextview

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

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

当我有非英语文本时,挑战就开始了,例如" Hindi"语言。

让我们说我进入了#34;परक"在textview中,如果我从右到左一次删除一个字符,我可以分别将删除的字符识别为क,र,प。

当我在字符串

中有印地语元音时,真正的问题就开始了

例如:如果我有一个文字"परी"。然后根据印地语文本它包含三个字符प,र,ी。这里用印地语语言是长元音

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

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

范围(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 个答案:

答案 0 :(得分: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)