LoginSignup
6
8

More than 5 years have passed since last update.

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

Posted at

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))
            }
        }
    }
}
6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8