頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


textView: shouldChangeTextInRange: replacementText: 内で新しい文字列を作る

UITextViewクラスを使う時、入力された文字が何なのかをチェックする場合なんかに次のデリゲートメソッドを使うことがあります。
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
このメソッドはユーザーが文字を入力するたびにコールされます。
次のコードは'Apple'と文字を入力した時に引数の内容を表示するコードとその結果です。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSLog(@"'%@' text:%@ , loc:%d , len:%d",textView.text , text , range.location , range.length);
    return YES;
}
UITextViewでAppleと入力

結果1

ふんふん、なるほど。 textView.textは入力前の文字列が入ってるんだな。 で、textで入力された文字が入ってると。 NSRangeオブジェクトには位置とかが入っているのか。


ところで、これらの内容から入力後の文字列をすぐに得たかったのですが、、、
え、もしかして、入力された位置を特定して分解して挿入とかそういうややこしい処理になっちゃうの、、、?
とか思っていたのですが、ありがたいことに使えるメソッドがNSStringクラスにありました。
stringByReplacingCharactersInRange:withString:

これを使って上のコードを書き換えたコードと結果を以下に:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSString *newString = [textView.text stringByReplacingCharactersInRange:range withString:text];
    NSLog(@"'%@' text:%@ , loc:%d , len:%d → %@",textView.text , text , range.location , range.length , newString);
    return YES;
}

結果2

お~、一撃じゃねえかっ!
スポンサーサイト




<< masksToBoundsでもマスクできる!  TopPage  Xcode 4.2 beta 6をダウンロードしてみた >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/499-97154142




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.