web-dev-qa-db-ja.com

Swift 3.0のNotificationCenterとSwift 2.0のNSNotificationCenterを使用してデータを渡す方法は?

私は私のSwift iosアプリにsocket.ioを実装しています。

現在いくつかのパネルで私はサーバーを聞いていて着信メッセージを待ちます。各パネルでgetChatMessage関数を呼び出してそうしています。

func getChatMessage(){
    SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            //do sth depending on which panel user is
        })
    }
}

しかし、これは間違ったアプローチであることに気付いたので、変更する必要があります。今は1回だけメッセージの受信を開始したいのですが、このメッセージを受信するパネルに渡してください。

だから私はNSNotificationCenterを介して着信メッセージを渡したいです。これまでのところ、何かが起こったという情報を渡すことはできましたが、データ自体を渡すことはできませんでした。私はそれをやっていました:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)

それから私はと呼ばれる機能を持っていた:

func showSpinningWheel(notification: NSNotification) {
}

私はそれを呼び出したいと思ったときはいつでも私はやっていました:

NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)

それでは、どうやったらオブジェクトmessageInfoを渡して、それを呼び出される関数に含めることができますか?

98
user3766930

Swift 2.

[NSObject:AnyObject]型のオプションのDictionaryであるuserInfoを使用して情報を渡しますか。

  let imageDataDict:[String: UIImage] = ["image": image]

  // Post a notification
  NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil, userInfo: imageDataDict)

 // Register to receive notification in your class
 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: notificationName, object: nil)

 // handle notification
 func showSpinningWheel(notification: NSNotification) {
  if let image = notification.userInfo?["image"] as? UIImage {
  // do something with your image   
  }
 }

Swift 3.0バージョン

UserInfoは[AnyHashable:Any]を取りますか?引数として、Swiftでは辞書リテラルとして提供しています。

  let imageDataDict:[String: UIImage] = ["image": image]

  // post a notification
  NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) 
  // `default` is now a property, not a method call

 // Register to receive notification in your class
 NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

 // handle notification
 func showSpinningWheel(_ notification: NSNotification) {

  if let image = notification.userInfo?["image"] as? UIImage {
  // do something with your image   
  }
 }

NOTE: Notification“ names”はもはや文字列ではなく、Notification.Name型なので、NSNotification.Name(rawValue:"notificationName")を使っているので、独自のカスタム通知でNotification.Nameを拡張できます。

extension Notification.Name {
static let myNotification = Notification.Name("myNotification")
}

// and post notification like this
NotificationCenter.default.post(name: .myNotification, object: nil)
242
Sahil

スイフト3用

let imageDataDict:[String: UIImage] = ["image": image]

  // post a notification
  NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) 
  // `default` is now a property, not a method call

 // Register to receive notification in your class
 NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

 // handle notification
 func showSpinningWheel(_ notification: NSNotification) {
        print(notification.userInfo ?? "")
        if let dict = notification.userInfo as NSDictionary? {
            if let id = dict["image"] as? UIImage{
                // do something with your image
            }
        }
 }

スイフト4用

let imageDataDict:[String: UIImage] = ["image": image]

  // post a notification
  NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) 
  // `default` is now a property, not a method call

 // Register to receive notification in your class
 NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

 // handle notification
 @objc func showSpinningWheel(_ notification: NSNotification) {
        print(notification.userInfo ?? "")
        if let dict = notification.userInfo as NSDictionary? {
            if let id = dict["image"] as? UIImage{
                // do something with your image
            }
        }
 }
28
Sachin Rasane

こんにちは@sahil私はSwift 3のためのあなたの答えを更新します

let imageDataDict:[String: UIImage] = ["image": image]

  // post a notification
  NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) 
  // `default` is now a property, not a method call

 // Register to receive notification in your class
 NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

 // handle notification
 func showSpinningWheel(_ notification: NSNotification) {
        print(notification.userInfo ?? "")
        if let dict = notification.userInfo as NSDictionary? {
            if let id = dict["image"] as? UIImage{
                // do something with your image
            }
        }
 }

お役に立てば幸いです。ありがとう

15
Ilesh

let dictionary = self.convertStringToDictionary(respondceString)
NotificationCenter.default.post(名前:NSNotification.Name(rawValue: "SOCKET_UPDATE")、オブジェクト:辞書)

1
Nitin

Swift 4.2では、NSNotificationを使ってコードの表示と非表示を切り替えるために次のコードを使用しました。

 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardheight = keyboardSize.height
        print(keyboardheight)
    }
}
0