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
}
コードのどこが悪いのかわかりません。上記のコードは、最初のリンクから見つけた、回答済みとして最初にマークされたものです。コードはSwiftに変換されました。
データを渡すためにオブジェクトパラメータを使用しないでください。これは、同じ名前であるが特定のオブジェクトからの通知をフィルタリングすることを目的としています。したがって、通知を投稿するときにオブジェクトを渡し、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)")
}
タイプ[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
}
}
ビューが読み込まれる前に通知が投稿されるため、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) }
}
sendData
メソッドでtextField.text
をNotificationオブジェクトに渡し、incomingNotification
で次のようにします。
guard let theString = notification.object as? String else {
print("something went wrong")
return
}
resultLabel.text = theString
ブロックを使用して、コントローラー間でデータを渡すこともできます。