LoginSignup
8
5

More than 3 years have passed since last update.

[Swift] Delegateが分からない初心者のための最後の受け皿

Posted at

今回作るもの

黄色のボタンを押すと画面が遷移され黄色くなる実装をdelegateを使って実装&説明します。

image.png image.png

きっかけ

Swiftのdelegateの説明をQiitaでたくさん読みましたがいまいち理解できず、なんとなく実装していました。delegateで詰まることが多かったので、アウトプットの機会にしようと思います。

対象

私のように他の記事を読んでも理解に苦しんだ方々に読んで頂きたいです。

Delegateとは

Delegateは委譲という意味ですが、そのクラスではできないことを他のクラスでやってもらうため委譲が必要になるのです。
詳しくコードと共に見ていきましょう。

実際のコード

3ファイル作成しました。
1つめははじめの画面のViewController
2つめは黄色画面遷移先のYellowViewController
3つめはViewControllerのCellのクラス(ButtonTableViewCell)

まず1つ目のViewControllerです。

スクリーンショット 0002-12-07 12.38.21.png
ここでは一枚目の黄色ボタンのViewの部分を作っています

次に黄色画面遷移先のYellowViewControllerです

スクリーンショット 0002-12-07 13.06.19.png
黄色の画面にするViewの部分を作っています

最後に先ほど作った黄色ボタンのCellのクラスです

スクリーンショット 0002-12-07 13.04.26.png
ここではcellの中のボタンタップ時の処理を行えます。
「ここに処理を書きたい」の部分に

let yellowViewController = YellowViewController()
navigationController?.pushViewController(yellowViewController, animated: true)

を入れて黄色画面に飛ばしてやりたいですが、CellではNavigationControllerが使用できないので、他の画面で処理をする必要があるのです。そこでdelegateという考え方が必要になります。

Delegateの使い方

1, protocolを宣言
2, delegateを宣言
3, 発火させたい場所にdelegate設置
4, 受け渡し先のクラスで継承
5, 受け渡し先のViewにdelegateを呼び出す
6, 処理を実装する

具体的な実装方法

スクリーンショット 0002-12-07 13.44.04.png
1, まずprotocolを発火させたい(ここでは@IBActionのあるButtonTableViewCell)クラスで宣言します。

protocol [delegate名]: class {
   func [メソッド名]
}

2, delegateを発火させたい(ここでは@IBActionのあるButtonTableViewCell)クラスで宣言します
3, 実際に発火させたい箇所(ここでは@IBActionの中)でdelegateを設置
4, ViewControllerに戻って、delegate名を継承する
5, ViewControllerでcellを使える場所で、delegateを呼び出す
6, そのままでは実際にしたい処理が書かれていないので、protocolで宣言したmethodをViewController内で書きます

おまけ (元々あるDelegate)

ViewControllerにも元々

buttonTableView.delegate = self
buttonTableView.dataSource = self

と書かれていますが、これも同様に

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,

UITableViewDelegate, UITableViewDataSourceを継承しているからです。
その証拠に、
スクリーンショット 0002-12-07 13.57.30.png
UITableViewDelegateを右クリックして見てみましょう。
スクリーンショット 0002-12-07 13.59.19.png
protocolが宣言されている訳です。
ViewControllerでデフォルトでtableViewが使えていたのも理由があったのですね。


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    }

最後に

最後まで読んでいただきありがとうございます。理解していただけたしょうか?
delegateはswiftを学習し始めで必ずと言っていいほど、詰まる箇所だと思います。
とても複雑に見えていましたが、根本を理解してみると簡単なものでした。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5