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デリゲートメソッドが実行されます。