2017-02-09 53 views
1

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

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

挑战从非英文文本开始,例如“印地语”语言。假设我在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进行了检查,并且在删除时能够识别。 等候为好奇的答复....

注:代码是写在雨燕2.3

+1

这是uncode问题吗?你可以尝试一次将字符串转换为固定的unicode,然后比较范围? – idocode

+1

参数收到的'range'的值是多少?我不知道有关印地文字符,但在Swift Playground中,''परी“。characters.count'和'”¡“字符.count'返回'2' ...但是,''परी”。lengthOfBytes (使用:.utf8)'是'9'和'''''lengthOfBytes(使用:.utf8)'是'6'。似乎是如何处理UNICODE字符串的问题。 –

回答

1

当我在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) 

你的代码似乎在斯威夫特2写入,但是在斯威夫特3,就变成:

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

谢谢OOPer,它工作。干杯.... – AMUL