Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

delegate(デリゲート)のsample NO3 swift

More than 3 years have passed since last update.

デリゲート。それを聞くとついビクビクしてしまう私。それは私がまだまだデリゲートと仲良しじゃないから。
だから私はデリゲートと仲良くなるためにデリゲートのことをもっと知ろう。それを記録に残しておこうと思ってここに書かさせていただきます。No3:dragon:

今度は本来xcodeにあるデリゲートメソッドを自作するというものです。
今回は書くことがたくさんあってコメントだらけになってしまったのでみにくくなってたらごめんんさい。:crying_cat_face:

今回参考にさせていただいたURLです。→
http://nukenuke.hatenablog.com/entry/2015/09/17/120749

デリゲートを自作するためには、プラスして何をするか?

デリゲートメソッドにするものを作成したプロトコルに宣言する。

@objc protocol SampleViewDelegate {


     @objc optional func didChangeBackgroundColor(str:String)
}

デリゲートメソッドを使うためにデリゲートの宣言しとく。

weak var delegate: SampleViewDelegate?

使いたいところでデリゲートメソッドを呼ぶ

self.delegate?.didChangeBackgroundColor!(str:"押されました!")

全体的なcode↓

ViewController.swift
//わたし

import UIKit

//わたしはあなたと一緒じゃないとできないの。
//作成したデリゲートを宣言します。
class ViewController: UIViewController,SampleViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        //このクラスでのviewにsampleクラスで作ったviewを入れます。
        let view = Sample(frame:CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0));

        //このviewの色々な設定はここ(self)で行います。
        //あなたの子はあなたの色々んものを引き継ぐわ
        view.delegate = self

        //作成したviewをこのクラスが持っているviewに入れます(表示)
        self.view.addSubview(view)

    }


    /*このdidChangeBackgroundColorのメソッドの実行されるタイミングはボタンが押された時です*/

    //デリゲートメソッドのカスタマイズ
    //あなたをカスタマイズします
    func didChangeBackgroundColor(str:String) {

        //didChangeBackgroundColorが実行されるタイミングでstrで渡されている引数を使い簡単なログを表示します。
        print(str);  //押されました!

        //didChangeBackgroundColorが実行されるタイミングで自分のviewのバックにあるself.viewの色を青にします。
        self.view.backgroundColor = UIColor.blue
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

DelegateSample.swift
//あなたは本来xcodeにいるけど。いないあなたを作る = 自作Delegate

import Foundation
import UIKit

//あなた
// SampleViewDelegate プロトコルを記述 デリゲートとして扱うものはこういう書き方をする。
@objc protocol SampleViewDelegate {

    // デリゲートメソッド定義
    //optionalをつけることで必ずしも宣言しないといけないデリゲートにはならない。
    //optionalの部分がrequiredだと必ず実装しないといけないデリゲートになる。
    //@objc optionalがない状態だとrequiredとして扱われるらしいです。
     @objc optional func didChangeBackgroundColor(str:String)
}

class Sample : UIView{

    //SampleViewDelegateのインスタンスを宣言
    //このクラスでデリゲートを使用するので宣言しとく。
    weak var delegate: SampleViewDelegate?

    override func draw(_ rect: CGRect) {

        //ボタンを作成
        let button = UIButton()
        button.setTitle("Tap", for: .normal)
        button.frame = (frame:CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0));
        button.backgroundColor = UIColor.red

        //ボタンが押された時に実行するメソッド作成
        button.addTarget(self, action: #selector(tappedButton(sender:)), for: .touchUpInside)

        self.addSubview(button)
    }


    //ボタンが押された時にデリゲートメソッドであるdidChangeBackgroundColorを実行する。
    //あなたが呼ばれるタイミング
    @IBAction func tappedButton(sender: AnyObject) {

        // デリゲートメソッドを呼ぶ(処理をデリゲートインスタンスに委譲する)
        //デリゲートにすることで色々なところでカスタマイズできるようになる。
        self.delegate?.didChangeBackgroundColor!(str:"押されました!")
    }
}

シュミレータで表示するとこんな感じです。
ボタンが押される前
Simulator Screen Shot 2017.03.25 19.50.07.png

ボタンが押された後
Simulator Screen Shot 2017.03.25 19.50.13.png

ちなみにもちろん押されたたんびログの"押されました!"は出されます。

もっともっと勉強して、今度は参考なしでデリゲートを書いて見たいです。頑張れ!わたし!:fire:

sachiko-kame
よろしくお願いします!✨
https://sachiko-kame.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away