2017-02-09 8 views
1

ユーザがキーパッドの削除ボタンを押すと、UITextViewから削除された文字を取得しようとしています。iOSのUITextViewから削除された文字を取得できません

たとえば、:(abc)のようにテキストビューにテキストを入力すると、範囲と場所を確認して削除された文字を取得できます。英語のテキストに問題はありません

"ヒンディー語"などの英語以外のテキストがあると、挑戦が始まります。

私は、テキストビューで "परक"と入力し、一度に1文字ずつ右から左に削除すると、削除された文字をそれぞれक、र、पとして識別できます。私は「परी」などのテキストを持っている場合:

私は、文字列などのために

でヒンディー語の母音を持っている本当の問題スタート

。その後、ヒンディー語のテキストによると、प、र、ीの3つの文字が含まれています。ここではヒンディー語の長い母音です

私はtextviewにenterを入力すると、デリゲートメソッドはこのテキストを識別できます。

しかし、キーボードの削除ボタンを押して単語 "परी"を削除すると、削除された単語を判断するための範囲計算が間違っているようです。 私は

としてレンジ(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でチェックして、削除されたときにそれを識別することができます。不思議の返信を待つ ....

注:私はUITextView"परी"の最後の文字を削除すると、コードが

+1

問題はありますか?文字列を固定Unicodeに変換してから範囲を比較してみてください。 – idocode

+1

パラメータで受け取った 'range'の値は何ですか?私はヒンディー語の文字については知りませんが、スウィフトプレイグラウンドでは ''文字列 '。characters.count'と ''पर "。characters.count' return' 2' ...しかし、 ''परी'。lengthOfBytes (.utf8を使用)は '9'と' 'पर"です。lengthOfBytes(.utf8を使用)は '6'です。 UNICODE文字列をどのように処理しているかに問題があるようです。 –

答えて

1

スウィフト2.3で書かれて、私は、デリゲートメソッドでNSRange(location: 2, length: 1)を得ました。空ではありません。長さは0ではありません。

substringを検索するコードは完全に間違っています。

IOSのAPIは、そのlocationlengthNSStringの基礎である、UTF-16に基づいて、文字列に関連する操作のためNSRangeを返します。 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

関連する問題