この記事は公開されてから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
も分け隔てなく同時に愛していきたいですね。