コードスニペット (UITexfField編)
テーマ
UITexfFieldのコードスニペットです。 今回は、UITextFieldDelegateを分離して、UIViewControllerで使いやすくします。
実装手順
- UITextFieldDelegateの拡張クラスを作る
- UIViewControllerから利用する
1. UITextFieldDelegateの拡張クラスを作る
import UIKit typealias TextFieldShouldReturn = (textField: UITextField) -> Bool typealias TextFieldShouldClear = (textField: UITextField) -> Bool typealias TextFieldShouldBeginEditing = (textField: UITextField) -> Bool typealias TextFieldShouldEndEditing = (textField: UITextField) -> Bool typealias TextFieldDidBeginEditing = (textField: UITextField) -> () typealias TextFieldDidEndEditing = (textField: UITextField) -> () class TextFieldDelegate: NSObject, UITextFieldDelegate { var textFieldShouldReturn: TextFieldShouldReturn? var textFieldShouldClear: TextFieldShouldClear? var textFieldShouldBeginEditing: TextFieldShouldBeginEditing? var textFieldShouldEndEditing: TextFieldShouldEndEditing? var textFieldDidBeginEditing: TextFieldDidBeginEditing? var textFieldDidEndEditing: TextFieldDidEndEditing? func setupTextFieldShouldReturn(textFieldShouldReturn: TextFieldShouldReturn){ self.textFieldShouldReturn = textFieldShouldReturn } func setupTextFieldShouldClear(textFieldShouldClear: TextFieldShouldClear) { self.textFieldShouldClear = textFieldShouldClear } func setupTextFieldShouldBeginEditing(textFieldShouldBeginEditing: TextFieldShouldBeginEditing) { self.textFieldShouldBeginEditing = textFieldShouldBeginEditing } func setupTextFieldShouldEndEditing(textFieldShouldEndEditing: TextFieldShouldEndEditing) { self.textFieldShouldEndEditing = textFieldShouldEndEditing } func setuptextFieldDidBeginEditing(textFieldDidBeginEditing: TextFieldDidBeginEditing) { self.textFieldDidBeginEditing = textFieldDidBeginEditing } //MARK: - UITextFieldDelegate //Returnボタンがタップされた時に呼ばれる func textFieldShouldReturn(textField: UITextField) -> Bool { //キーボードを消す textField.resignFirstResponder() if textFieldShouldReturn != nil{ if let block = textFieldShouldReturn { return block(textField: textField) } } return true } //クリアボタンがタップされた時に呼ばれる func textFieldShouldClear(textField: UITextField) -> Bool { if textFieldShouldClear != nil{ if let block = textFieldShouldClear { return block(textField: textField) } } return true } //テキストフィールドを編集する直前に呼び出される func textFieldShouldBeginEditing(textField: UITextField) -> Bool { if textFieldShouldBeginEditing != nil{ if let block = textFieldShouldBeginEditing { return block(textField: textField) } } return true } //テキストフィールドの編集が終了する直前に呼び出される func textFieldShouldEndEditing(textField: UITextField) -> Bool { if textFieldShouldEndEditing != nil{ if let block = textFieldShouldEndEditing { return block(textField: textField) } } return true } //テキストフィールドを編集する直後に呼び出される func textFieldDidBeginEditing(textField: UITextField) { if textFieldDidBeginEditing != nil{ if let block = textFieldDidBeginEditing { block(textField: textField) } } } //テキストフィールドの編集が終了する直後に呼び出される func textFieldDidEndEditing(textField: UITextField) { if textFieldDidEndEditing != nil{ if let block = textFieldDidEndEditing { block(textField: textField) } } } }
2. UIViewControllerから利用する
下記は、エンターキーを押下されたときのイベント処理です。
import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextField! var delegate: TextFieldDelegate? override func viewDidLoad() { super.viewDidLoad() setup() } func setup() { delegate = TextFieldDelegate() delegate?.setupTextFieldShouldReturn({ (textField) -> Bool in print("\(textField.text)") return true }) textField.delegate = delegate //プレースホルーダーの設定 textField.placeholder = "ここにデータを入力してください" //クリアボタンの表示を指定する(Never/Always/UnlessEditing/WhiteEditing) textField.clearButtonMode = UITextFieldViewMode.WhileEditing //最小フォントサイズ textField.minimumFontSize = 8.0 //表示文字が表示領域を超えた場合の処理を設定する textField.adjustsFontSizeToFitWidth = true } }
まとめ
delegateのメソッドを毎回書くのが面倒なのと、毎回ググるのが面倒なので、分離させてみました。 個人的には、可読性も良いと思います。