危機感を持った理系学生のプログラミング日記
コンバンワ🦊
今日は早めに書いています。(現在時刻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クラスでのデリゲートメソッドが実行されてる
ていう流れになります。
参考になったサイト貼っときます。
今日はここまで
拙い文章で恥ずかしい限りですが、今後も書いていこうと思います🦊
ではまた。