스위프트 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()
}
}
'iOS::스위프트(swift) > just swift' 카테고리의 다른 글
swift Slider 값 변경, 별점 기능 구현하기 (0) | 2021.02.10 |
---|---|
(swift)label width 제한, 폰트 사이즈 조절, 화면 가운데로 가져오기 (0) | 2021.02.10 |
swift POST 통신하기 (0) | 2020.12.29 |
swift Delegation 스위프트 델리게이트 개념 이해하기 (0) | 2020.10.17 |
swift 기초 핵심 개념들 공부하기 ! (0) | 2020.10.12 |
최근댓글