【Swift】UITextFieldの文字数を制限したりスペースを入力させないようにする

2022.03.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以前、SwiftUIで文字数を制限したり、スペースを入力させないようにする記事を書いたのですが、

【SwiftUI】TextFieldの文字数を制限したりスペースを入力させないようにする

UITextFieldで実装する日が来るかもしれないと思い、記事にしておきました。

環境

  • Xcode 13.2.1

UITextFieldの準備

パスワード入力フォームという前提で進めていきます。

Storyboard

UITextFieldを配置しました。

ViewController.swift

passwordTextFieldのIBOutlet接続、入力出来る最大文字数の定数maxPasswordLengthUITextFieldDelegateを使用できるように準備しておきました。

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()
    }

出来たもの

デモ

uitextfield-password-demo

コード

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も分け隔てなく同時に愛していきたいですね。

参考