无法从 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进行字符串相关操作时,其locationlength基于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 的当前位置弹跳到顶部和文本不可见

从 UITextView 中的点击获取单词

如何从 Swift 中的 UITextView 获取链接范围

动态 UIScrollView 中的动态 UITextView - iOS

如何检测 URL 是不是已粘贴/输入到 UITextView? Swift iOS [关闭]