Posted at

UITextFieldの文字数制限とキーボードの収納 [Swift3.0]

More than 1 year has passed since last update.

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