これは何
Twitterなどでよく見る文字数カウントを実現する方法です。
UITextView の解説はよくありますが、UITextField のものは意外となかったのでメモしておきます。
やり方
例えば上記の記事と同じように shouldChangeTextInRange
でやろうとすると一見問題なさそうなのですが、「゛(だくてん)」等も一文字としてカウントしてしまうため、カウントがずれます。
-
おはよう
で4文字 -
おはようこ
で5文字 -
おはようご
で6文字(おかしい) -
おはよう
で5文字(おかしい)
なので、ShouldChange
(入力前)ではなく DidChange
(入力後)のデリゲートでカウントする必要があります。しかし、残念ながら UITextField にはそれが存在しません。
対策
UITextFieldTextDidChangeNotification
で、入力後の通知を受け取れるようにします。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldDidChange:)
name:UITextFieldTextDidChangeNotification
object:_titleField];
NSNotificationCenter.defaultCenter().addObserver(self,
selector:"textFieldDidChange:",
name: UITextFieldTextDidChangeNotification,
object: nil)
通知後に呼ばれるメソッドで文字数をカウントします。
- (void)textFieldDidChange:(NSNotification *)notification
{
NSUInteger length = textField.text.length;
}
func textFieldDidChange(notification:NSNotification) {
let length = textField.text.length
}
これで正しい文字数をカウントできるようになりました。
「入力した文字数」ではなく、入力できる「残り文字数」を表示したい場合は、最大文字数から引いてやれば良いですね。