【Swift】UITextFieldの文字数を制限したりスペースを入力させないようにする
以前、SwiftUIで文字数を制限したり、スペースを入力させないようにする記事を書いたのですが、
UITextField
で実装する日が来るかもしれないと思い、記事にしておきました。
環境
- Xcode 13.2.1
UITextFieldの準備
パスワード入力フォームという前提で進めていきます。
Storyboard
UITextField
を配置しました。
ViewController.swift
passwordTextField
のIBOutlet接続、入力出来る最大文字数の定数maxPasswordLength
、UITextFieldDelegate
を使用できるように準備しておきました。
import UIKit class ViewController: UIViewController { @IBOutlet private weak var passwordTextField: UITextField! private let maxPasswordLength = 4 override func viewDidLoad() { super.viewDidLoad() passwordTextField.delegate = self } } extension ViewController: UITextFieldDelegate { }
テキストフィールドのセレクションが変更された時に処理を行う
UITextField
のテキストに変更がある度に処理を行いたい為、textFieldDidChangeSelection(_:)
メソッドを使用します。
extension ViewController: UITextFieldDelegate { func textFieldDidChangeSelection(_ textField: UITextField) { // テキストフィールドのセレクションが変更される度に実行される // ここでテキストの最大文字数とスペースの規制を行う } }
最大文字数を超えた文字を切り捨てる
UITextField
のセレクションに変更がある度に、最大文字数以上なら超過分を切り捨てる処理を追加します。
func textFieldDidChangeSelection(_ textField: UITextField) { guard let password = passwordTextField.text else { return } if password.count > maxPasswordLength { passwordTextField.text = String(password.prefix(maxPasswordLength)) } }
passwordTextField.text
の文字数がmaxPasswordLength
を超える場合は、それ以降の文字を切り捨てたものをpasswordTextField.text
に代入しています。
スペースを削除する
半角と全角のスペースを文字列から取り除くextensionメソッドを作成しました。
extension String { func removingWhiteSpace() -> String { let whiteSpaces: CharacterSet = [" ", " "] return self.trimmingCharacters(in: whiteSpaces) } }
removingWhiteSpace
メソッドを使用して、passwordの文字列から全角半角スペースを取り除いた値を取得します。
func textFieldDidChangeSelection(_ textField: UITextField) { guard var password = passwordTextField.text else { return } if password.count > maxPasswordLength { password = String(password.prefix(maxPasswordLength)) } passwordTextField.text = password.removingWhiteSpace() }
出来たもの
デモ
コード
import UIKit class ViewController: UIViewController { @IBOutlet private weak var passwordTextField: UITextField! private let maxPasswordLength = 4 override func viewDidLoad() { super.viewDidLoad() passwordTextField.delegate = self } } extension ViewController: UITextFieldDelegate { func textFieldDidChangeSelection(_ textField: UITextField) { guard var password = passwordTextField.text else { return } if password.count > maxPasswordLength { // 最大文字数超えた場合は切り捨て password = String(password.prefix(maxPasswordLength)) } // 文字列から全角半角スペースを取り除く passwordTextField.text = password.removingWhiteSpace() } }
おわりに
UITextField
でも入力文字数の制限をしたり、スペースを入力させないようにすることが出来ました。
UITextField
もSwiftUIのTextField
も分け隔てなく同時に愛していきたいですね。