web-dev-qa-db-ja.com

データを渡すNotificationCenter Swift

Swift 3. NotificationCenterを使用して、あるクラスから別のクラスにtextField文字列を渡そうとしています。このリンクから答えを見つけようとしています: NSString変数をNSNotificationで他のクラスに渡す および Swiftで通知を使用して複数の値を渡す方法

上記のリンクからいくつかの回答を試しましたが、何も機能しませんでした。

私のコード:

//最初のVC

import UIKit


extension Notification.Name {        
public static let myNotificationKey = Notification.Name(rawValue: "myNotificationKey")    
}


class ViewController: UIViewController {

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func sendData(_ sender: AnyObject) {

    let userInfo = [ "text" : textView.text ]
    NotificationCenter.default.post(name: .myNotificationKey, object: nil, userInfo: userInfo)

}

}

// SecondVC

 import Foundation
 import  UIKit

 class viewTwo: UIViewController {

@IBOutlet weak var result: UILabel!



override func viewDidLoad() {


}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(self.notificationReceived(_:)), name: .myNotificationKey, object: nil)
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: .myNotificationKey, object: nil)
}

func notificationReceived(_ notification: Notification) {
    guard let text = notification.userInfo?["text"] as? String else { return }
    print ("text: \(text)")

    result.text = text
}

enter image description here }

コードのどこが悪いのかわかりません。上記のコードは、最初のリンクから見つけた、回答済みとして最初にマークされたものです。コードはSwiftに変換されました。

9
Joe

データを渡すためにオブジェクトパラメータを使用しないでください。これは、同じ名前であるが特定のオブジェクトからの通知をフィルタリングすることを目的としています。したがって、通知を投稿するときにオブジェクトを渡し、addObserverを追加するときに別のオブジェクトを渡すと、それを受け取りません。 nilを渡すと、基本的にこのフィルターをオフにします。

代わりにuserInfoパラメータを使用する必要があります。

まず、Notification.Nameの拡張子として通知の名前を定義することをお勧めします。このアプローチは、はるかに安全で読みやすくなっています。

extension Notification.Name {        
    public static let myNotificationKey = Notification.Name(rawValue: "myNotificationKey")    
}

通知の投稿:

let userInfo = [ "text" : text ]
NotificationCenter.default.post(name: .myNotificationKey, object: nil, userInfo: userInfo)

申し込む:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(self.notificationReceived(_:)), name: .myNotificationKey, object: nil)
}

登録解除:

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: .myNotificationKey, object: nil)
}

呼び出されるメソッド:

func notificationReceived(_ notification: Notification) {
    guard let text = notification.userInfo?["text"] as? String else { return }
    print ("text: \(text)")
}
21
alexburtnik

タイプ[AnyHashable:Any]のオプションの辞書であるuserInfoを使用してテキストを渡しますか? in Swift 3.0そしてそれは[NSObject:AnyObject]?in Swift 2.0

@IBAction func sendData(_ sender: UIButton) {

// post a notification
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: ["text": textValue.text])

print(textValue) // textValue printing

}

viewDidLoad

//通知を受け取るために登録します

NotificationCenter.default.addObserver(self, selector: #selector(self. incomingNotification(_:)), name:  NSNotification.Name(rawValue: "notificationName"), object: nil)

およびincomingNotificationで

func incomingNotification(_ notification: Notification) {
if let text = notification.userInfo?["text"] as? String {
   print(text)
  // do something with your text   
}


}
4
Sahil

ビューが読み込まれる前に通知が投稿されるため、dispatchQueueを使用します。したがって、通知の投稿を遅らせるだけです。

@IBAction func sendData(_ sender: AnyObject) {

    let userInfo = [ "text" : textView.text ]
      DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
 NotificationCenter.default.post(name: .myNotificationKey, object: nil, userInfo: userInfo)        }

}
1
Hamza Saeed

sendDataメソッドでtextField.textをNotificationオブジェクトに渡し、incomingNotificationで次のようにします。

guard let theString = notification.object as? String else {
    print("something went wrong")
    return 
}

resultLabel.text = theString

ブロックを使用して、コントローラー間でデータを渡すこともできます。

1