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の存在はコード本体とは別の場所に あって馴染みずらい感覚が私にはあるのですが、このクラスでもっと親近感わきそうだと思いました、、、

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

大阪都構想の橋下さんの鼻に誠意をもって顔認識処理で画鋲を刺す

先日大阪都構想でニュースがざわついておりましたが、 そこで自分が思っていたこと、なぜ鼻ピンしたのかを顔認識サンプルと誠意を込めて書き記してまいります。(※選挙ポスターに画鋲を刺す事や、そもそも「他人様」の画像を変更することがタブーな事を理解しつつの投稿です。問題がないかの問い合わせメールを送る予定です。画像はWikipediaからの引用です)

CoreTextでTextViewの一文字の向きを変える(解決前)

TextViewの文字を縦書きにしたいなぁと考えている時にCoreTextとNSMutableAttributedStringの二つのどちらかなら実装できそう。CoreTextを利用してトライして無理ならAttributedStringをトライしてみます。

URLエンコードとデコード

サーバとデータのやりとりをしているとURLエンコードしないと文字化けしちゃったりと問題がでる場合があります。 phpのurlencodeやurldecodeと連携させる場合等、Swift側でどうやってエンコードすれば良いかの方法を記載しております
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!