Notification
작성일
Passing data
- 6.Notification
- 알려주고 통제해주는 개념
- 호출부, 구현부가 따로 되어 있음
Notification
//구현부
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let notificationName = Notification.Name("sendSomeString")
NotificationCenter.default.addObserver(self, selector: #selector(showSomeString), name: notificationName, object: nil)
}
@objc func showSomeString(notification: Notification) {
if let str = notification.userInfo?["str"] as? String {
self.dataLabel.text = str
}
}
위 코드를 보면, 일단 이름이 필요해서 “sendSomeString”라는 이름으로 정했고,
NotificationCenter쪽에, default가 있고, addObserver가 있는데,
#selector는 특정한 함수를 호출하겠다는 것이다.
그래서 그 호출하겠다는 함수를 밑에 showSomeString이라고 만든 것인데
여기에는 notification 정보를 받아올 수 있다.
여기에서 userInfo라고하는게 key, values 형태로 들어 있고, 키로 접근을 하고, 그안에 있는 데이터를
self.dataLabel.text = str, 즉 화며에 뿌려주겠다는 소리이다.
//버튼
@IBAction func moveToNoti(_ sender: Any) {
let detailVC = NotiDetailViewController(nibName: "NotiDetailViewController", bundle: nil)
self.present(detailVC, animated: true, completion: nil)
}
버튼을 눌렀을때 작동하게 만든 코드
//호출부
class NotiDetailViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func notiAction(_ sender: Any) {
let notificationName = Notification.Name("sendSomeString")
let strDic = ["str" : "noti string"]
NotificationCenter.default.post(name: notificationName, object: nil, userInfo: strDic)
self.dismiss(animated: true, completion: nil)
}
}
버튼이 눌려졌을때, NotificationCenter.default에 post라고 있는데,
post는 notification이름으로 호출할수가 있다. userInfo로 데이터값을 전달해준다.
그리고 키는 str 벨류는 noti string로 만든것이다.
텍스트필드를 누르면 키보드가 올라오게하기
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let notificationName = Notification.Name("sendSomeString")
NotificationCenter.default.addObserver(self, selector: #selector(showSomeString), name: notificationName, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}
}
그리곤
@objc func keyboardWillShow() {
print("will show")
}
이렇게 해주면 된다.
notification은 연결점이 없을때, 그쪽에 전달을 하거나, 호출을 할때 사용이 가능하다.
연결점이 전혀 없을때 사용하는 것이다.