【Swift】 UITextFieldに文字数制限を設ける方法


前置き

少し久しぶりのQiita投稿。

(自作アプリ公開に向けて日々いろいろやってたんですが、細かいトコの修正やら稼動確認してると、今までの反復に当たる部分でぶつかる壁が多くて、あまり目新しい収穫がなかったので。)

さて表題の件。

ブログ等を参考にしても、エントリ時期から時間が経ってSwiftの書き方にギャップが出たり、(日本語入力もカバーするか、という点で)実装の仕方に違いがあったりで、マネしてみても自分の想定する実装にならないコトが多い。

最終的に、いささか記事のエントリ時期としては古くて、少しSwift5に対応するために修正は必要だったけれど、下記「参考」記載のURLのブログエントリが自分なりに一番取り込みやすい内容でした。


開発環境

端末:MacBook Pro/MacOS 10.14.5(Mojave)

Xcode:10.2.1

Swift:5


実装内容

「こういうコトやりたい」だけ前置きに書いていても、

実際、下記のソースで何ができるようになったかが伝わりづらいかもしれないので、

どんなコトがどんな風にできるのか、できるだけ書くようにしようかな、と。

(今回は画面イメージもないので)

・UITextFieldに対する、入力文字数の制限。

・日本語入力(入力→変換→確定、というプロセス)でもOK。

 入力確定時に制限文字数以上であれば切り捨てる。

・あくまで制限文字数のある項目1つに対する入力制限の実装。

 (複数の項目で、それぞれ制限文字数が異なるような場合、別途カスタマイズは必要。)


ソースサンプル


ViewController.swift


class ViewController: UIViewController, UITextFieldDelegate {

// 入力チェックを行うUITextField
@IBOutlet weak var myTextField: UITextField!
// 入力可能な最大文字数
let maxLength: Int = 5

override func viewDidLoad() {
super.viewDidLoad()

myTextField.delegate = self

// myTextFieldの入力チェック(文字数チェック)をオブザーバ登録
NotificationCenter.default.addObserver(self,
selector: #selector(textFieldDidChange(notification:)),
name: UITextField.textDidChangeNotification,
object: myTextField)
}

// オブザーバの破棄
deinit {
NotificationCenter.default.removeObserver(self)
}

// 入力チェック(文字数チェック)処理
@objc func textFieldDidChange(notification: NSNotification) {
let textField = notification.object as! UITextField

if let text = textField.text {
if textField.markedTextRange == nil && text.count > maxLength {
textField.text = text.prefix(maxLength).description
}
}
}

...
}



参考

・雑食プログラミング備忘録

 [iOS] UITextFieldの最大文字数を設定する

 http://chicketen.blog.jp/archives/50002171.html


感想

会社での担当業務としてHTMLを触るコトが多いのもあって、UITextFieldの文字数制限くらいStoryboardでチャチャっと設定できると思っていたトコロから、気づいたら実装・稼動確認、そしてここへアウトプットするのも合わせるとフツーに2、3時間経ってました。

英語入力だけの文字数制限だけなら割とすぐにできたトコロから、日本語に対応したモノへ発展させるのにけっこう悩まされました。

Swift2,3の頃の記事が多くて、Swift4,5だと書き方が全然違って来てる(もしくは同じ挙動にならない)っていうコトに割と出くわすので、自分自身がSwift5で色々試して、そのギャップを埋めるコトにささやかながら貢献できれば嬉しいです。