无法从 iOS 中的 UITextView 获取已删除的字符
Posted
技术标签:
【中文标题】无法从 iOS 中的 UITextView 获取已删除的字符【英文标题】:Not able to get deleted character from UITextView in iOS 【发布时间】:2017-02-09 15:25:19 【问题描述】:当用户按下键盘上的删除按钮时,我正在尝试从 UITextView 中检索已删除的字符。
当我在 textview 中为 eg:(abc) 输入一些文本时,我可以通过检查范围和位置来检索已删除的字符。所以英文文本没问题
当我有一个非英文文本时,挑战就开始了,例如“印地语”语言。
假设我在textview中输入了“परक”,然后如果我从右到左一次删除一个字符,我可以将删除的字符分别识别为क,र,प。
当字符串中有印地语元音时,真正的问题就开始了
例如:如果我有一个文本为“परी”。然后根据印地语文本,它包含三个字符,即प、र、ी。这里ी是印地语的长元音
当我在 textview 中输入 ी 时,委托方法能够识别此文本。
但是,当我按下键盘上的删除按钮从单词“परी”中删除 ी 时,确定删除哪个单词的范围计算似乎出错了。 我得到范围值来删除ी为
范围(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 编写的
【问题讨论】:
是解码问题吗?您可以尝试将字符串转换为固定的 unicode 然后比较范围吗? 参数接收到的range
的值是多少?我不知道印地语字符,但在 Swift Playground 中,"परी".characters.count
和 "पर".characters.count
都返回 2
... 但是,"परी".lengthOfBytes(using: .utf8)
是 9
和 "पर".lengthOfBytes(using: .utf8)
是 6
。似乎是您如何处理 UNICODE 字符串的问题。
【参考方案1】:
当我在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)
【讨论】:
以上是关于无法从 iOS 中的 UITextView 获取已删除的字符的主要内容,如果未能解决你的问题,请参考以下文章
SWIFT iOS - 从多行 uitextview 获取带有换行符的文本,因为它们在屏幕上可见
禁用 UITextView 中的滚动,同时避免在 ios 的当前位置弹跳到顶部和文本不可见
如何从 Swift 中的 UITextView 获取链接范围