1.delegateを使いたくない理由
1.難しいから!(怠惰です。誰か教えてください(切実))
2.個人開発だし、ぶっちゃけ自分が分かりやすいほうでいいんじゃない?(自己責任です)
2.やりてぇこと
前提条件
View1とView2がある
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とやってることほぼ同じやん..
インターフェース(プロトコル)作るか作らんかだけの話やった..。