【Swift】NotificationCenterを使うには?

本サイトはアフィリエイト広告を利用しています。
NotificationCenterが使えると便利だけど・・・
  • どうすれば使えるのか?
  • どんな使い道があるのか?

外部ライブラリを使おうとしたり、色々サンプルコードを調べていると、たまに見かけたりするNotificationCenter。

なんだか難しいことをやっていそうに見えますが、実はそうでもなく、使い方がわかると便利だったりします。

NotificationCenterを使うには?

次の4つを用意すればOKです。

  1. Notification.Name(通知の名前)
  2. NotificationCenter.default.addObserver(通知を受け取る方)
  3. @objc func(addObserverで使用、通知を受け取ったら実行される)
  4. 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でデータを受信したら、画面に表示している値を更新する
  • アプリで日付を表示していて、日付が変わったのを反映させる

「この場合にこの処理をしたい!けど、どうすれば??」と困った時に思い出すと役に立ったりします。

コメント

タイトルとURLをコピーしました