NotificationCenter zum übergeben von Daten in Swift
Arbeite ich an einem test-Projekt im Swift-3. Ich versuche mich zu übergeben textField string aus einer Klasse in eine andere Klasse, die mit NotificationCenter. Ich bin versucht zu trainieren die Antwort von diesem link: pass NSString-variable einer anderen Klasse mit NSNotification und wie übergeben Sie mehrere Werte mit einer Meldung in swift
Ich habe versucht, einige Antworten aus den obigen link, aber nichts funktionierte.
Mein code:
//First 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
}
}
Ich bin nicht sicher was ist falsch mit dem code. Oben, code ursprünglich gekennzeichnet als eine Antwort, die ich gefunden habe aus dem ersten link. Code konvertiert wurden, um Swift.
- Duplikat von stackoverflow.com/questions/36910965/...
- Nicht verwenden Sie Objekt, um Daten weiterzugeben, es funktioniert nicht auf diese Weise. Haben Sie einen Blick auf die Antwort unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht mit dem Objekt-parameter, um Daten weiterzugeben. Es soll zum filtern von Benachrichtigungen mit dem gleichen Namen, aber von einem bestimmten Objekt. Also, wenn Sie einige Objekt, wenn Sie die post eine Benachrichtigung und ein anderes Objekt, wenn Sie addObserver, Sie werden es nicht erhalten. Wenn Sie übergeben Sie null, dass Sie im Grunde diesen filter deaktivieren.
Sollten Sie verwenden
userInfo
parameter statt.Erstens, es ist besser, um zu definieren Benachrichtigung name als Erweiterung für die Benachrichtigung.Name. Dieser Ansatz ist viel sicherer und besser lesbar:
Post-Benachrichtigung:
Abonnieren:
Unsubscribe:
Methode aufgerufen werden:
(_:)
am Ende Ihres selectoraddObserver
muss aufgerufen werden, bevorpostNotification
offensichtlich.Pass text mit
userInfo
was ist ein optionales Dictionary of Art [AnyHashable:Jede]? in Swift 3.0 und es ist [NSObject : AnyObject]? in swift 2.0in
viewDidLoad
//Register Benachrichtigung erhalten
und in incomingNotification
In Ihrem
sendData
Methode übergebentextField.text
in Notification-Objekt und in IhremincomingNotification
hierzu:Können Sie auch Blöcke, die zum übergeben von Daten zwischen Steuerungen.
object
Eigenschaft sollte nicht verwendet werden, wie, dass.addObserver
MethodeNotificationCenter.default.addObserver(self, selector: #selector(self.incomingNotification(_:)), name: NSNotification.Name(rawValue: "NOTIFICATION_NAME"), object: nil)
. Versuchen Sie auch, verwenden Sie selbsterklärende Namen für Benachrichtigungen. Und ein weiteres und rechten Weg zum übergeben von Daten ist mit userInfo.Verwenden
dispatchQueue
weil Ihre Meldung veröffentlicht, bevor Sie Ihre Ansicht laden. Daher nur geben, Verzögerung bei der Benachrichtigung der Post.