모달을 dismiss 한 후에는 viewWillAppear나 viewDidAppear가 실행되지 않기 때문에 CollectionView를 reload 하려면 NotificationCenter로 구현해야 한다.
아래 코드에서 HomeViewController와 DetailViewController가 나오는데 DetailViewController가 모달로 띄울 ViewController이고, HomeViewController는 DetailViewController가 dismiss된 후에 보이는 ViewController이다.
모달이 dismiss 될 때 NotificationCenter를 보낼 줄 것이다. DetailViewController가 사라지기 전인 viewWillDisappear에서 NotificationCenter를 보냈다.
// DetailViewController.swift
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.post(name: NSNotification.Name("DismissDetailView"), object: nil, userInfo: nil)
}
NotificationCenter을 보냈으니 이제 받을 것이다. HomeViewController의 viewDidLoad에서 NotificationCenter의 observer를 추가하는데, 여기서 중요한 것은 NotificationCenter를 post 할 때 적었던 NSNotification.Name과 동일한 이름을 적어야 받을 수 있다.
그리고 selector 메서드에서 CollectionView를 reload 한다. 이때 DispatchQueue를 이용해서 main 스레드에서 실행할 수 있도록 한다.
class HomeViewController: UIViewController {
@IBOutlet weak var collectionview: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
self,
selector: #selector(self.didDismissDetailNotification(_:)),
name: NSNotification.Name("DismissDetailView"),
object: nil
)
}
@objc func didDismissDetailNotification(_ notification: Notification) {
DispatchQueue.main.async {
self.collectionview.reloadData()
}
}
}
💙 참고한 블로그 💙