UITextFieldのshouldChangeCharactersInRangeに関して

UITextFieldのdelegateでshouldChangeCharacterslnRangeというのがあります。

これでは引数でrangeとstringを持っていてそれぞれ

range:選択中の範囲

string:そこに入れる文字

が渡され、これをうまく使えば文字数の制限ができたりします。

文字数の制限に関しては問題ないのですが、困るのは文字数のカウントをしたい場合

使っていてiOS6からバグがあることがわかりました。

かなり限定的な話ですが、日本語キーボードで削除ボタンを長押しし、長文を一気に消す際、渡される値と全く違う挙動をします。ただし、英語のキーボードでは問題なく動作します。

例えば、range.lengthに3、 stringに""が入ってるとすると

本来であればrange.locationから三文字分を""に変えるので事実上三文字削除される動作になるはずがなぜか一文字しか消えてなかったり、逆に正しく動作して三文字消える場合もあります。

これに関してはどんな挙動をするか全くわかりません。少なくても調査しているときにはかなりずれる量にも幅がありました。

また、この現象が起きるのは大体UItextFieldに表示されている文字が10文字を切ったあたりからおきます。

最新のIOS6.1.4でもこの現象を確認することができたのでまだ修正されてないと思います。ただiOS5ではシミュレーターでも実機でも正しく動作しており、IOS6からのバグだと思います。

ちなみに削除ボタン長押しで複数文字削除が行われるのは30文字を超えてからになります。

もしTextFieldで文字数カウントをしているなら一度確認したほうがいいのかもしれません。

何か間違っている点があれば教えていただけるとありがたいです。