LoginSignup
0
0

Swift初心者の私はdelegateを使いません!じゃあどうする..?

Last updated at Posted at 2024-02-06

1.delegateを使いたくない理由

1.難しいから!(怠惰です。誰か教えてください(切実))
2.個人開発だし、ぶっちゃけ自分が分かりやすいほうでいいんじゃない?(自己責任です)

2.やりてぇこと

前提条件

View1View2がある
View1にはCollectionViewがある
View1とView2のセグエはモーダル遷移

目的

View2を閉じる時にView1のCollectionViewをreloadDataさせて!
※モーダル遷移のためviewWillAppearでイベントは発火しません。

3.ChatGPTに実装方法聞いてみたよ

1.Delegateを使用する:
View2が閉じられるときに、Delegateを介してView1に通知し、collectionViewを更新します。
2.NotificationCenterを使用する:
View2が閉じられるときに、NotificationCenterを使用してView1に通知し、collectionViewを更新します。
3.Completion Handlerを使用する:
View2からView1に戻る際、Completion Handlerを使用して処理を実行し、collectionViewを更新します。

逆張り大好きな私は遠慮しておきます(難しいのはキライです)

4.自己流なやりかた

🔷遷移先のView2作成時に初期化メソッドでView1のインスタンスをメンバに渡しちゃう

class View1: UIViewController {
    // ..省略..
    
    // 画面2へモーダル遷移
    @IBAction func openView2() {
        let view2 = View2(viewInstance: self) //🔷初期化時に自分自身(self)を渡す
        present(view2, animated: true, completion: nil)
    }
}

🔶プロパティで前画面のView1をもってるから、View1.メソッドを自由に使えるぜ!

class View2: UIViewController {
    weak var viewInstance: View1? // 🔶View1のインスタンスを保持するプロパティ

    // コンストラクタ
    init(viewInstance: UIViewController) {
        self.viewInstance = viewInstance
        super.init(nibName: nil, bundle: nil)
    }
    
    // View1のcollectionViewを最新にして閉じる
    @IBAction func close() {
        viewInstance?.collectionView.reloadData() // 🔶View1のcollectionViewを更新
        self.dismiss(animated: true, completion: nil)
    }
}

ふと仕事中に思いついたから記事書いてみたよ。
手元にmacないから試せないんだ、ところどころ間違ってたらごめんね

後日談

delegateについて詳しく調べてみたけど、もうこれdelegateとやってることほぼ同じやん..
インターフェース(プロトコル)作るか作らんかだけの話やった..。

0
0
1

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
0
0