当用户按下键盘上的删除按钮时,我试图从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编写的
答案 0 :(得分:2)
当我删除"परी"
中UITextView
的最后一个字符时,我在委托方法中获得了NSRange(location: 2, length: 1)
。它不是空的,如你所见,它的长度不是0.
问题是您检索substring
的代码完全错误。
当iOS API为字符串相关操作返回NSRange
时,其location
和length
基于UTF-16,这是NSString
的基础。您不应将这些值用于基于characters
(String.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)