Deep_Dev
article thumbnail

 

프로젝트 진행도중 NavigationController로 연결된 View에서 dismiss이후 자동으로 reloadData()가 호출되지 않는다는 것을 알게 되었다. dismiss 이후 보이는 화면에서 viewWillAppear()를 해줬음에도 말이다. 그래서 구글링한 결과 원인을 찾을 수 있었다.

 

Navigation Controller를 dismiss 한 이후에는 viewWillAppear나 viewDidAppear가 실행되지 않는다. 

 

CollectionView나 TableView를 reload 하려면 NotificationCenter로 구현해야 한다.

 

아래코드에서 TableViewController와 DetailViewController가 나오는데, DetailViewController가 모달로 띄울 ViewController 이고, TableViewController는 DetailViewController가 dismiss된 이후에 보이는 ViewController이다.

 

1. NotificationCenter Post

모달이 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)

 

2. NotificationCenter AddObserver

NotificationCenter를 보냈으니 이제 받아야 할 것이다.

TableViewController의 viewDidLoad에서 NotificationCenter의 observer를 추가한다.

여기서 주의할 점은, NotificationCenter를 Post할 때 적었던 NSNotification.Name과 동일한 이름을 적어야 받을 수 있다.

 

그리고 selector 메소드에서 TableView를 reload한다. 이때 DispatchQueue를 이용하여 main 스레드에서 실행할 수 있도록 한다.

class TableViewController: 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.tableView.reloadData()
          }
     }
}

 

tableView혹은 CollectionView등 모두 사용가능하다.