-
Notification ExampleUIKit 2020. 8. 18. 01:04
navigation으로 새로운 화면을 띄울 때, full screen으로 띄우는 것이 아니라, 아래에서 위로 올라오는 방식으로 화면을 띄운다고 해보겠습니다.
이 때, save 버튼을 누르면 새로운 view에 작성한 내용이 이전 화면의 테이블 뷰에도 나타나게 하고 싶습니다.
만약 새로운 view를 띄우는 방식이 full screen이라면, viewWillAppear에서 tableView.reloadData()를 하면 되지만,
그렇지 않다면, 위의 방법이 통하지 않습니다.
이런 경우에는, Notification 개념을 이용하여서, save 버튼을 눌렀을 때, 테이블이 reload 되도록 합니다.
우선 변경됐다라고 신호를 보낼 View에서 extenstion으로 notification 이름부터 추가해줍니다.
extension ComposeViewController{ static let newMemoDidInsert = Notification.Name(rawValue: "newMemoDidInsert") }
NotificationCenter.default.post(name: ComposeViewController.newMemoDidInsert, object: nil)
그리고 save버튼과 연결된 Action에 위의 코드를 추가하여서, save버튼이 눌렸을 때, newMemoDidInsert notification로 연결된 observer들에게 내가 원하는 이벤트를 하도록 해줍니다.
여기서 내가 원하는 이벤트는 reloadData로, 이 부분은 reload될 tableView가 있는 곳에서 작성해줍니다.
옵저버 실행코드는 view가 나타나고 한번만 실행하면 되므로 viewDidLoad에서 작성합니다.
override func viewDidLoad() { super.viewDidLoad() token = NotificationCenter.default.addObserver(forName: ComposeViewController.newMemoDidInsert, object: nil, queue: OperationQueue.main, using: { [weak self] (noti) in self?.tableView.reloadData() }) }
-> NotificationCenter.default.addObserver를 통해 옵저버를 추가해줍니다.
-> forName에는 Notification의 이름을 추가합니다.
-> ui 업데이트 코드는 반드시 메인스레드에서 실행해야하므로, queue에 OperationQueue.main을 추가해줍니다.
-> using의 클로저에는 실행할 이벤트를 추가해줍니다.
또한 옵저버는 token의 이름으로 추가되고 삭제됩니다.
옵저버는 제거를 따로 해주어야하기 때문에 삭제를 할 때에는 아래의 코드를 추가합니다.
deinit{ if let token = token{ NotificationCenter.default.removeObserver(token) } }
'UIKit' 카테고리의 다른 글
Hex to Color (0) 2020.08.18 Alert Controller (0) 2020.08.18 Date Formatter (원하는 모습으로 날짜 출력) (0) 2020.08.17 Notification Center (0) 2020.07.04 View Controller의 생명주기 (0) 2020.07.04