HOME > NSNotificationCenter
AppDelegateのイベント(アプリがアクティブ)になるタイミングでViewControllerに通知する為にはどうすればいいのか?と 調査しているとこのクラスにたどり着きました。delegateを利用せずにイベントの通知をViewController間で簡単に実装できるので 使いやすいです!
NSObject
↑
NSNotificationCenter
参考:Foundation Framework Reference NSNotificationCenter Class Reference
参考:SwiftでNSNotificationCenterを使う
参考:[iOS8] Swiftでアプリがバックグラウンド・フォアグラウンドになった時の処理(NSNotificationCenter)
参考:Swiftでいい感じにNSNotificationCenter#addObserverForNameを使う
参考:Swift で NSNotification の userInfo を扱う
起動中のアプリがアクティブに切り替わった際に呼ばれるAppDelegateのイベントをサブビューのViewControllerで受け取る方法を記載してみます。
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)
}
...
}
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を利用する。
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]);)
}
...
}
受け取り側でアンラップして取得します。
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の存在はコード本体とは別の場所に あって馴染みずらい感覚が私にはあるのですが、このクラスでもっと親近感わきそうだと思いました、、、
2021-05-14 14:21:41 | WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。
AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、
昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は... |
2021-05-06 14:04:37 | LINEのアニメーションスタンプ制作の落とし穴、、、失敗談
ゴールデンウィークにLINEスタンプを作成してみました。
作り切って申請も通したんですが、意図したアニメーションと違う、、、、
LINEクリエーターの画面だと、アニメーションのプレビュー... |
2021-05-01 18:05:35 | 久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。
忘れないようにメモ
エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。
ターゲット→ex... |
Tweet | |||
|