2017-02-09 55 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