UITextFieldの最大文字数を設定するのは簡単なように見えるが、日本語の入力を許可している場合は少々厄介だ。

今回は日本語を入力しつつ、文字数を制限する方法に迫ってみる。 
 
まずはStoryboardでUITextViewを配置しよう。
textfield_max01
このUITextFieldはViewControllerに関連付けておく。

基本形を作成する。
まずはシンプルな文字数制限を行ってみよう。

これが基本の処理だ。
returnTypeとtextFieldShouldReturn()を設定することによって、文字入力の完了ボタンを押すとキーボードが隠れてくれる。
逆に言うと、設定していないといつまでたってもキーボードが隠れないので、これは必ず行っておいた方が良いだろう。
textfield_max02

文字列制限をしてみる。
文字列制限とは言っても、textView(textView: , shouldChangeTextInRange range: , replacementText text:)を使ってはいけないのは近頃ではよく知られているので、最初からUITextFieldTextDidChangeNotificationを使うことにする。
まずは以下をViewDidLoad()の最後に追加する。

それから以下をViewControllerクラスに追加する。

1.登録したオブザーバは必ず解除しよう。
ここではdeinitで解除を行う。

2.テキストフィールドに変化があったら呼ばれるメソッド。

3.文字数をシンプルにカウントして後ろを切り落とす。
今回は分かりやすいように3文字を最大とした。

これで実行してみよう。

英語入力は問題なく動く。
しかし、「東京」と入力しようとすると「とうk」で切れてしまう。
textfield_max03
そこで役に立つのがUITextFieldのmarkedTextRangeというプロパティだ。
これは日本語入力を行うと、その位置や範囲を渡してくれる優れものだ。
そして、変換が完了するとnilが設定されるようである。

これを利用してtextFieldDidChange()を以下のように変更する。

実行してみよう。
textfield_max04
「とうきょうは」と打った段階ではまだ制限はかかっていない。
次に「東京は雨」を選択してみよう。
textfield_max05
しっかりと3文字に制限されている。
これで完成だ!

参考文献
Swiftで文字数制限をつけた話 - akaimo Engineer Blog
iOS で文字数制限つきのテキストフィールドをちゃんと作るのは難しいという話 - blog.niw.at