外部ライブラリを使おうとしたり、色々サンプルコードを調べていると、たまに見かけたりするNotificationCenter。
なんだか難しいことをやっていそうに見えますが、実はそうでもなく、使い方がわかると便利だったりします。
NotificationCenterを使うには?
次の4つを用意すればOKです。
- Notification.Name(通知の名前)
- NotificationCenter.default.addObserver(通知を受け取る方)
- @objc func(addObserverで使用、通知を受け取ったら実行される)
- NotificationCenter.default.post(通知を置く方)
2画面のアプリで試してみましょう。
2画面のアプリで試してみる
まず、ViewControllerを2つ用意して、ボタンで遷移するようにsegueで繋ぎます。
ボタンのある方は「ViewController」、ボタンのない方は「SecondViewController」にします。
Notification.Nameを用意
わかりやすくするためにファイル名を「Extension.swift」として、ファイルを追加します。
そのファイルにNotification.Nameを追記します。
import Foundation
extension Notification.Name {
static let postViewDidLoaded = Notification.Name("ViewDidLoaded")
static let postViewWillAppear = Notification.Name("ViewWillAppear")
static let postViewWillDisappear = Notification.Name("ViewWillDisappear")
}
NotificationCenter.default.addObserver、@objc funcを用意
「ViewController.swift」にAddObserver、@objc funcを追記します。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
NotificationCenter.default.addObserver(self, selector: #selector(didLoaded), name: .postViewDidLoaded, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(willAppear), name: .postViewWillAppear, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(willDisappear), name: .postViewWillDisappear, object: nil)
}
@objc func didLoaded() {
print("view Did Loaded")
}
@objc func willAppear() {
print("view will appear")
}
@objc func willDisappear() {
print("view will disappear")
}
}
NotificationCenter.default.postを用意
次に、「SecondViewController.swift」のファイルを追加して、遷移後の画面に紐付けます。
「SecondViewController.swift」にPostを追記します。
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.post(name: .postViewDidLoaded, object: nil)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.post(name: .postViewWillAppear, object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.post(name: .postViewWillDisappear, object: nil)
}
}
これで準備は整いました。
通知が出ている様子を確認してみましょう
アプリを動作させて、ボタンを押して画面遷移させてみましょう。
デバッグコンソールに次のように表示されると思います。
view Did Loaded
view will appear
また、遷移後の画面をスライドさせて画面を消すと、次のように表示されると思います。
view will disappear
「SecondViewController.swift」には、print(“”)は使っていないのに、デバッグコンソールに表示されていますね。
どんな場合に使うのか?
先程までのアプリで、「SecondViewController.swift」でpostされた通知を、ViewContoroller.swiftで受け取って、それに応じた処理をしていることがわかります。
ですので、異なるViewControllerに処理を渡したい時に役に立ちます。
例えば次のような場合でしょうか。
- bluetoothでデータを受信したら、画面に表示している値を更新する
- アプリで日付を表示していて、日付が変わったのを反映させる
「この場合にこの処理をしたい!けど、どうすれば??」と困った時に思い出すと役に立ったりします。
コメント