Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > NSNotificationCenter

NSNotificationCenterでコード間のイベントやりとり

サンプル画像

AppDelegateのイベント(アプリがアクティブ)になるタイミングでViewControllerに通知する為にはどうすればいいのか?と 調査しているとこのクラスにたどり着きました。delegateを利用せずにイベントの通知をViewController間で簡単に実装できるので 使いやすいです!

NSNotificationCenterのクラス階層


NSObject

NSNotificationCenter


参考:Foundation Framework Reference NSNotificationCenter Class Reference
参考:SwiftでNSNotificationCenterを使う
参考:[iOS8] Swiftでアプリがバックグラウンド・フォアグラウンドになった時の処理(NSNotificationCenter)
参考:Swiftでいい感じにNSNotificationCenter#addObserverForNameを使う
参考:Swift で NSNotification の userInfo を扱う

やってみた

起動中のアプリがアクティブに切り替わった際に呼ばれるAppDelegateのイベントをサブビューのViewControllerで受け取る方法を記載してみます。



AppDelegate.swift(イベント登録側)


import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        return true
    }
    //アプリがアクティブになった時によばれる関数
    func applicationWillEnterForeground(application: UIApplication) {
        NSNotificationCenter.defaultCenter().postNotificationName("applicationWillEnterForeground", object: nil)
    }
    
    ...
}


ViewController.swft (イベント受け取り側)


import UIKit
import WebKit

class ViewController: UIViewController,WKNavigationDelegate,UITableViewDelegate, UITableViewDataSource {
  
    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "viewWillEnterForeground:", name: "applicationWillEnterForeground", object: nil)
    }
    func viewWillEnterForeground(notification: NSNotification?){
        println("呼ばれました!");
    }


イベントリスナーを削除する場合

removeObeserverを利用して削除します。


NSNotificationCenter.defaultCenter().removeObserver(self)

カスタマイズ


① Notificatin通知にデータをくっつけて送る。ー> userInfoを利用する。



AppDelegate.swift(イベント登録側)

postNotificationNameにuserInfoパラメータを追加します。


import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        return true
    }
    //postNotificationNameでuserInfoを追加
    func applicationWillEnterForeground(application: UIApplication) {
        NSNotificationCenter.defaultCenter().postNotificationName("applicationWillEnterForeground", object: nil, userInfo: ["testNumber": 123]);)
    }
    
    ...
}


ViewController.swft (イベント受け取り側)

受け取り側でアンラップして取得します。


import UIKit
import WebKit

class ViewController: UIViewController,WKNavigationDelegate,UITableViewDelegate, UITableViewDataSource {
  
    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "viewWillEnterForeground:", name: "applicationWillEnterForeground", object: nil)
    }
    func viewWillEnterForeground(notification: NSNotification?){
        if let userInfo = notification?.userInfo {
            let value = userInfo["testNumber"]! as Int
            println(value) // 123
        }
        println("呼ばれました!");
    }

まとめ

なによりもDelegateせずにイベントのやりとりができるので便利です!AppDelegate.swiftの存在はコード本体とは別の場所に あって馴染みずらい感覚が私にはあるのですが、このクラスでもっと親近感わきそうだと思いました、、、

↓こんな記事もありますよ!

CLLocationManagerで現在位置を取得

あっさりしたシンプルなサンプルがなかったので省略型です。

Pintoを1年利用してほんとにプログラマーの背筋がピンとなった(P!nto)

猫背どうにかならないかな、、、、。プログラマーとしての職業上日中8割9割は画面と押し問答している私は、 熱中すればするほど画面に食い入り知らず知らずに前のめりの姿勢に。姿勢が悪い、、、、分かってるんだけど、やめられない。

SQLiteを使いたい。ラッパーを検証してみる。(#2)

前回の記事でSQLiteのラッパのRMDB, SWiftData,SQLite.swiftの検証をトライしまいたが、時間の問題で頓挫してしまいましたので続きです。 。ある程度準備が完了しましたので、それぞれのサンプルを動かしてみてみようと思います。InsertとSelectとインストール感を比較してみます。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!