스위프트 Modal dismiss한 이후 tableView reload하기

(swift tableView reload after dismiss modal)


POST 통신으로 서버에 apiRequest를 upload하고 modal을 dismiss한 후 나오게 되는 tableView를 reload하고 싶었다. 알고 보니 modal을 dismiss하는 경우 viewWillAppear나 viewDidAppear는 먹히지 않더라.


그래서 한참을 어떻게 하는지 찾아보다 NotificationCenter를 이용해보라는 말에 시도했고, 결국에는 성공했다.

어떻게 이것이 가능했는지 설명해보도록 하겠다.


두 가지 ViewController가 있다고 가정하자.

하나는 PostCommentViewController로, 우리가 modal 방식으로 띄운 VC이다.

나머지 하나는 MovieDetailViewController로, dismiss한 이후에 보여질 VC이다.


필자는 먼저 PostCommentViewController에 다음을 추가했다.

import UIKit

let DidDismissPostCommentViewController: Notification.Name = Notification.Name("DidDismissPostCommentViewController")

...

위 let 변수를 추가함으로써 Notification Name을 하나 만들어줬다. 그리고 해당 modal을 dismiss하는 시점에서 다음의 코드를 추가해줬다. (정확히는 post가 성공하면 실행되게 만들었지만 어쨌든 dismiss 또한 post가 성공해야 실행되는 부분이었으므로 큰 차이는 없다고 본다.)

NotificationCenter.default.post(name: DidDismissPostCommentViewController, object: nil, userInfo: nil)

이제 NotificationCenter를 post했으므로 dismiss된 이후에 보여질 viewController인 MovieDetailViewController에서 받아주는 코드를 적어줘야 할 차례. 다음 코드를 추가했다. 코드는 viewDidLoad() 안에 추가해주었다.


override func viewDidLoad() {
    super.viewDidLoad()

      ...

    NotificationCenter.default.addObserver(self, selector: #selector(self.didDismissPostCommentNotification(_:)), name: DidDismissPostCommentViewController, object: nil)
}

위 코드는 DidDismissPostCommentViewController 를 받을 때마다 selector에 적힌 함수가 실행되도록 한다.

selector에 해당하는 함수는 다음과 같다.


    @objc func didDismissPostCommentNotification(_ noti: Notification) {
        requestComments() 
      // 이 부분을 해주어야 다시 comment들을 api로 가져올 수 있었다.
      // 즉, reload할 데이터를 불러와야 바뀌는 게 있다는 의미다.
      // 안 해서 고생함...
        OperationQueue.main.addOperation { // DispatchQueue도 가능.
            self.tableView.reloadData()
        }

    }

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom