危機感を持った理系学生のプログラミング日記

コンバンワ🦊

今日は早めに書いています。(現在時刻20:43)

さて、今日は地図アプリを作りながらデリゲートを深堀りしました。

ややこしいですがなんとか概念がわかってきた気がします🦊

 

デリゲートの流れ

まず当たり前ですが、デリゲートを使うには2つ以上のクラスが必要です。

デリゲートを委託するクラスをBクラス、委託されるクラスをAクラスとします。

Bクラスでの処理

まずプロトコルを書きます。

protocol SearchLocationDelegate {

    

    func searchLocation(idoValue:String,keidoValue:String)

}

 

プロトコルを使えるようにインスタンスを保持

var delegate:SearchLocationDelegate?

 

なんらかのイベントが発生した時(今回はOKボタンが押された時)にメソッドを起動するように記述。このBクラスでメソッドが起動されたタイミングを、「タイミングB」とします。

@IBAction func okAction(_ sender: Any) {

        

        //入力された値を取得

        let idoValue = idoTextField.text!

        let keidoValue = keidoTextField.text!

        

        //両方のテキストフィールドが空じゃなければ閉じる

        if idoTextField.text != nil && keidoTextField.text != nil{

            

            //こっちで引数を渡しながらデリゲートメソッドを呼ぶ

            delegate?.searchLocation(idoValue: idoValue, keidoValue: keidoValue)

            dismiss(animated: true, completion: nil)

        }

    }

 

Aクラスでの処理

Bクラスで作成したプロトコルを使えるように、Delegateプロトコルを継承する。

class ViewController: SearchLocationDelegate {

}

 

遷移先のSegueIDが"next"(Bクラスに遷移する時に)ならAクラスの中でBクラスのインスタンスを作り、Bクラスのプロパティ(delegate)にself(自分自身なのでA)を代入する。

このBクラスのプロパティに自分自身を代入して、Bクラスのデリゲートを使えるようにしたタイミングを「タイミングA」とします。

if segue.identifier == "next"{

            

            let nextVC = segue.destination as! NextViewController

            

            nextVC.delegate = self

            

        }

 

デリゲートメソッドの具体的な処理を記述する

//任されたデリゲートメソッド

    func searchLocation(idoValue: String, keidoValue: String) {

        

        if idoValue.isEmpty != true && keidoValue.isEmpty != true{

            

            let idoString = idoValue

            let keidoString = keidoValue

            

            //緯度、経度からコーディネート

            let coordinate = CLLocationCoordinate2DMake(Double(idoString)!,Double(keidoString)!)

            

            //表示する範囲を指定

            let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)

            

            //領域を指定

            let region = MKCoordinateRegion(center: coordinate, span: span)

            

            //領域をmapViewに指定

            mapView.setRegion(region, animated: true)

            

            //緯度経度から住所へ変換

            convert(lat: Double(idoString)!, log: Double(keidoString)!)

            

            //ラベルに表示

            addressLabel.text = addressString

            

        }else{

            

            addressLabel.text = "表示できません"

        }

    }

    

 

重要な事

タイミングBとタイミングAは同じタイミングで完全にイコールなので、

 

OKボタンが押された→タイミングB発動!!!! それと同時にタイミングAも発動!!!

→ Aクラスに画面が遷移→Aクラスでのデリゲートメソッドが実行されてる

 

ていう流れになります。

参考になったサイト貼っときます。

pg-happy.jp

 

今日はここまで

拙い文章で恥ずかしい限りですが、今後も書いていこうと思います🦊

ではまた。