実装イメージ
パスワードの入力欄など、ある文字数以上入力させたくないケースって多いと思います。
でも、各画面でdelegateを設定して...とか面倒極まりない。
以下のように、storyboardから設定できたらいいですよね。
拡張しましょう
UITextFieldを拡張します。
UITextField+maxLength.swift
import UIKit
private var maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let length = maxLengths[self] else {
return Int.max
}
return length
}
set {
maxLengths[self] = newValue
addTarget(self, action: #selector(limitLength), for: .editingChanged)
}
}
@objc func limitLength(textField: UITextField) {
guard let prospectiveText = textField.text, prospectiveText.count > maxLength else {
return
}
let selection = selectedTextRange
let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
#if swift(>=4.0)
text = String(prospectiveText[..<maxCharIndex])
#else
text = prospectiveText.substring(to: maxCharIndex)
#endif
selectedTextRange = selection
}
}
おわりに
便利なExtensionを見つけては試して、気に入ったら取り入れていくスタイルで勉強を進めています。
どなたかの参考になれば幸いです。