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