
【Swift】UITextFieldの文字数を制限したりスペースを入力させないようにする
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
以前、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も分け隔てなく同時に愛していきたいですね。











