JY-CONTENTS

JY

JY-CONTENTS
search

+

MENU

【Swift/ios】デリゲートの使い方

【Swift/ios】デリゲートの使い方

(DATE)

-

2017.12.29

(CATEGORY)

-

iosアプリ開発でのデリゲートの使い方

//UITextFieldDelegateデリゲートを採用
class ViewController: UIViewController, UITextFieldDelegate {

    //テキストフィールド
    @IBOutlet weak var myTextFIeld: UITextField!
    //ラベル
    @IBOutlet weak var myLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //ViewControllerクラスをテキストフィールドのデリゲートにする。(※1)
        //UITextFieldクラスのdelegateプロパティの型はUITextFieldDelegate
        myTextFIeld.delegate = self
    }

    //●テキストフィールドの値が変化した時に呼ばれるデリゲートメソッド
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        //テキストフィールドの値を取得
        //replacingCharactersメソッドがNSString対象なのでキャスト
        let str1 = textField.text! as NSString

        //引数でわかるのは変更された箇所だけなので、現在の値をreplacingCharactersメソッドで作る
        let str = str1.replacingCharacters(in: range, with: string)
        
        if str == "" {
            myLabel.text = "0"
        }else {
            myLabel.text = str
        }

        //trueを返すことでテキストフィールドの値が更新される
        return true
    }

    //●クリアボタンをタップした時に呼ばれるデリゲートメソッド
    func textFieldShouldClear(_ textField: UITextField) -> Bool {
        myTextFIeld.text = "0"
        
        //trueを返すことでテキストフィールドが更新されフィールド内が空になる
        return true
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

(※1)テキストフィールドのデリゲートになったことでViewControllerクラスにはテキストフィールドからイベントが送られてくる。このイベント群の中から処理を適用したいイベントをデリゲートメソッドとして実装する。

今回はUITextFieldのデリゲートです。
UITextFieldクラスがデリゲート元(委譲する側)でViewControllerがデリゲート先(委譲される側)です。

説明

ViewControllerクラスはUITextFieldDelegateプロトコルを採用することでテキストフィールドからのイベントの処理を行える(実装)ようになる。ようするにテキストフィールド(UITextFieldクラス)から発生したイベントの処理をViewControllerクラスがテキストフィールド(UITextFieldクラス)に変わって行う。
テキストフィールド(UITextFieldクラス)が委託する側でViewControllerクラスが委託された側。

別の見方をすると、テキストフィールドからのイベントをViewControllerクラスで行えるようにするということになる。そのためにはViewControllerクラスにUITextFieldDelegateプロトコルを採用しなければならない。

デリゲート先のオブジェクトを指定

UITextFieldクラスはdelegateプロパティを持っています。
13行目でデリゲートで使用するオブジェクト(デリゲート先)を指定しています。

myTextFIeld.delegate = self

delegateプロパティのデータ型はUITextFieldDelegateプロトコルです。
delegateプロパティにはUITextFieldDelegateプロトコルに準拠した型であればどのオブジェクトでも代入できます。
今回のデリゲート先(委譲される側)ViewControllerクラスなのでself(自身)を指定しています。

今回使用するイベント

今回使用するイベントは下記の2つです。

  • テキストフィールドの値が変化した
  • クリアボタンがタップされた

テキストフィールドの値が変化した時に呼ばれるデリゲートメソッド

optional public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

このデリゲートメドッドはテキストフィールドの値に変更があるたびに呼び出されます。

  • 第1引数(textField)・・・対象のテキストフィールド
  • 第2引数(range)・・・編集された範囲
  • 第3引数(string)・・・新規(新しく追加された)の文字列

クリアボタンがタップされた時に呼ばれるデリゲートメソッド

optional public func textFieldShouldClear(_ textField: UITextField) -> Bool

クリアボタンをタップするとテキストフィールドが空になりtextFieldShouldClearデリゲートメソッドが実行されます。

NEW TOPICS

/ ニュー & アップデート

SEE ALSO

/ 似た記事を見る

JY CONTENTS UNIQUE BLOG

search-menu search-menu