ココロミにきみ

本と体とプログラミング

swiftでdelegataの使い方練習

swiftでdelegateに慣れるための練習台です(iPhoneアプリを動かすプログラム)

 ーー 入門終わって初級くらい想定 ーー

delegateが何なのか、なんのためにあるか」は解説サイトを探してください

ここでは「何度も繰り返してdelegateを使ってみて、習うより慣れろ」です

何度も繰り返してると何だかしっくり来て、ある日、UIPickerViewのdelegateとかで、自分が何をしているのかが分かってくるかも!かも!!

 

◼️使い方想定(*segue・protocol・新しいswiftファイル作成が分かること)

★作るアプリ:2つの画面からデータを送りあって互いに内容を表示する

1回目

・初期設定の画面をまず作る(codeのコピーだけとっておく)

・Goalのサンプルの番号に従って、codeを書く

2回目以降(たぶん〜5、6回)

・初期画面から何も見ずにGoalまで書く(意味が分かるためには順番が大事!)

 

****  初期設定(何度もこれからスタートする) ****

//  ★画面1 ViewController.swift

 

import UIKit

class ViewController: UIViewController{

    @IBOutlet weak var label: UILabel!

    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {

        super.viewDidLoad()

    }

    @IBAction func buttonPressed(_ sender: Any) {

    }

    @IBAction func changeColor(_ sender: Any) {

        view.backgroundColor = UIColor.blue

    }

}

 

//  ★画面2 SecondViewController.swift

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var label2: UILabel!

    @IBOutlet weak var textFiled2: UITextField!

    override func viewDidLoad() {

        super.viewDidLoad()

    }

    @IBAction func buttonPressed2(_ sender: Any) {

    }

}

// ★プロトコル DataPassDelegate・・ 新しいファイルから作る

// ★画面遷移・・ segue設置 :  画面1→2 identifier : "goToSecondScreen"

 

**** Goal のサンプル **** 

//  画面1 ViewController.swift

 

import UIKit

// (11) DataPassDelegateプロトコルを批准させる

class ViewController: UIViewController,DataPassDelegate{

    @IBOutlet weak var label: UILabel!

    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {

        super.viewDidLoad()

    }

    // ① segueで画面遷移を作成(表示チェック)

    @IBAction func buttonPressed(_ sender: Any) {

        performSegue(withIdentifier: "goToSecondScreen", sender: self)

    }

    // ② 画面遷移の際に画面2に、画面1で入力した文字を送る

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // ③ segueの送り先となるViewControllerを作る

        let destinationVC = segue.destination as! SecondViewController

        // ⑤ 送り先のViewControllerのプロパティに、画面1のテキストを保存

        destinationVC.textFromScreen1 = textField.text!

        // ⑩ 画面2で定義されたdelegateに画面1自身を入れる

         destinationVC.delegate = self

    }

    // (12) DataPassDelegateプロトコルにあるfuncを定義

    func dataPass(textFromScreen2:String){

        label.text = textFromScreen2

    }

    // 画面遷移がどのように行われるかの確認用

    @IBAction func changeColor(_ sender: Any) {

        view.backgroundColor = UIColor.blue

    }

}

 

// 画面2 SecondViewController.swift

 

import UIKit

class SecondViewController: UIViewController {

    // ④ 画面1から送られるテキストを保存する

    var textFromScreen1 : String = ""

    // ⑨ DataPassDelegateプロトコルのオブジェクトを定義(先に⑧でプロトコルを作る)

    var delegate : DataPassDelegate?

    //

    @IBOutlet weak var label2: UILabel!

    @IBOutlet weak var textFiled2: UITextField!

    override func viewDidLoad() {

        super.viewDidLoad()

        // ⑥ 画面1から送られたテキスト入力を、label2に表示させる(buildして表示チェック)

        label2.text = textFromScreen1

    }

    @IBAction func buttonPressed2(_ sender: Any) {

        // (13)画面2→1へ情報を送るための

        delegate?.dataPass(textFromScreen2:textFiled2.text!)

        // ⑦ 画面2から画面1へ戻る命令を作る(表示チェック)

        dismiss(animated: true, completion: nil)

        /* ここで1→2の時と同じように(dimissを使わずに)、2→1も新たなsegueでつなぐ手もあるが、

         その場合は1→2→1→2・・・と回るたびに新たなオブジェクトが作られ、メモリがどんどん圧迫される

         結局、2→1にテキスト入力情報を送るために、データ受け渡し用プロトコルを作る

         背景色を青色に変えるボタンは、元の画面1に戻ったかどうかを確認するために用意*/

    }

}

 

// プロトコル DataPassDelegate

import UIKit

// ⑧ 2→1へのデータ受け渡し用にプロトコルを作る

protocol  DataPassDelegate {

    func dataPass(textFromScreen2:String)

}

**** おわり ****

 

もっとswiftを学びたい人へ

英語ですが下のUdemyのswiftのAngela先生のコースは、涙が溢れるくらいすごいです

このコースを紹介しても自分には何のメリットもないのですが、swiftの機能説明の種類の豊富さと、何度でも端折らずに説明する律儀さと、数多くの外部のサイトとの連携の実践などおそらく世界トップレベルの講義じゃないかと

分厚い日本語のswiftの本も10冊くらい読んだけど、それが講義全体の30%くらいで、中級以降の知識を得るにはもっってこいかと

* * *

難点はやっぱり英語であることで、イギリス英語なので聴きやすいほうだし、字幕も英語・日本語とあるけれど、やり通す気合いだけは必要かと

あと英語圏って、情報量が全然違う!っていう発見も

逆に言うと日本語だけの情報に頼ることの残念さと怖さも・・・

www.udemy.com