Swiftでテキストフィールドに文字数制限を設定するのが楽ではなかったので忘備録。
入力後にキーボードをしまう
ソース
import UIKit
class ViewController: UIViewController, UITextFieldDelegate { //(1)
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self //(2)
textField.returnKeyType = .done //(3)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//(4)
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
内容
(1)「UITextFieldDelegate」を実装(インプリメント)する
(2) UITextFieldのdelegate変数を自身を指定する
(3) UITextFieldの「returnキー」の表示を「done」に変更する
(4)「textFieldShouldReturn」関数を実装する。=>「Return」や「改行」などのキーをタップした時に呼ばれる処理。
-resignFirstResponder()を設定するとキーボードを閉じる。
テキストフィールドに文字数制限を設定する
ソース
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
//(1)
NotificationCenter.default.addObserver(
self,
selector: #selector(textFieldDidChange),
name: NSNotification.Name.UITextFieldTextDidChange,
object: textField)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//(2)
@objc private func textFieldDidChange(notification: NSNotification) {
let textFieldString = notification.object as! UITextField
if let text = textFieldString.text {
if text.characters.count > 8 {
textField.text = text.substring(to: text.index(text.startIndex, offsetBy: 3))
}
}
}
}
内容
(1)文字数制限をかけるテキストフィールドを監視対象にする
(2)テキストフィールドの入力イベントを監視し、変更があった場合に指定文字数(ここでは8文字)を超えた文字の入力をさせいない
キーボードを隠す + 文字数制限
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
textField.returnKeyType = .done
NotificationCenter.default.addObserver(
self,
selector: #selector(textFieldDidChange),
name: NSNotification.Name.UITextFieldTextDidChange,
object: textField)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
@objc private func textFieldDidChange(notification: NSNotification) {
let textFieldString = notification.object as! UITextField
if let text = textFieldString.text {
if text.characters.count > 8 {
textField.text = text.substring(to: text.index(text.startIndex, offsetBy: 3))
}
}
}
}