onthewavesのコードスニペット

SwiftやObjective-Cを中心にiPhoneアプリ開発に関するコードスニペットを書きます。

コードスニペット (UITexfField編)

テーマ

UITexfFieldのコードスニペットです。 今回は、UITextFieldDelegateを分離して、UIViewControllerで使いやすくします。

実装手順

  1. UITextFieldDelegateの拡張クラスを作る
  2. 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メソッドを毎回書くのが面倒なのと、毎回ググるのが面倒なので、分離させてみました。 個人的には、可読性も良いと思います。

おすすめ本のご紹介

www.amazon.co.jp