2016-07-28 14 views
1

Ich habe eine Klasse, die das Ziehen von UIButtons auf dem Bildschirm steuert. Ich möchte den Tag/die endgültige Position des Buttons auf touchesEnded erfassen.Keine Angabe bei der Weitergabe von Informationen mit NSNotifications?

Ich habe in meinem DragImageClass bekam:

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let dict = ["position":String(self.center),"tag": String(self.tag)] 

    NSNotificationCenter.defaultCenter().postNotificationName("buttonDropped", object: nil, userInfo: dict) 

    print(dict["position"]) // Does get printed 
    print("Should have sent") // Does get called 
} 

dann in meinem Hauptansicht, wo ich die Informationen habe, um die ich habe:

Mein Beobachter:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(testController.touchesStopped(_:)), name: "buttonDropped", object: nil) 

Meine Funktion:

func touchesStopped(notif : AnyObject) { 
    if let dict = notif.object as? NSDictionary { //Some error with this data type I guess? 
     let position = dict["position"] 
     let tag = dict["tag"] 
     print(position) // doesn't get printed 
     print(tag) // doesn't get printed 
    } 
} 

Alle ide als warum ich von diesen Werten nichts zurückbekomme? Wenn ich versuche, das Auspacken zu erzwingen, gebe ich nur die "Thread bad instruction" Sache.

Antwort

2

Wie Sie in Ihrem Anruf sehen können, ist das Objekt gleich Null, weil Sie das Wörterbuch als userInfo passieren (das ist der richtige Weg, es zu tun):

NSNotificationCenter.defaultCenter().postNotificationName("buttonDropped", object: nil, userInfo: dict) 

So um zurück, dass Wörterbuch zu bekommen, verwenden Sie nicht die object Eigenschaft der Anmeldung verwenden, um die userInfo Eigenschaft:

func touchesStopped(notif: NSNotification) { 
    if let dict = notif.userInfo { 
     let position = dict["position"] 
     let tag = dict["tag"] 
     print(position) 
     print(tag) 
    } 
} 

Randbemerkung: Konvertieren eines Punkt zu eine Schnur und zurück zu einem Punkt wird ein Schmerz sein, sollten Sie wahrscheinlich verwenden NSValue stattdessen wie folgt:

+0

Okay, das macht viel Sinn. Ich habe es umgestellt und bekomme immer noch einen Fehler, der besagt, dass .userInfo mehrdeutig verwendet wird? –

+0

Siehe meine Bearbeitung, die Benachrichtigung muss als 'NSNotification' deklariert werden, nicht' AnyObject' – deadbeef

+0

Yep funktioniert perfekt, danke Mann. –

2

Mit Blick auf die Dokumentation wird NSNotification.userInfo in Swift als [NSObject: AnyObject]? importiert. Versuchen Sie stattdessen:

if let notif = notif as? NSNotification, 
    let dict = notif.userInfo as? [NSObject: AnyObject] { 
    let position = dict["position"] 
    let tag = dict["tag"] 
    print(position) // doesn't get printed 
    print(tag) // doesn't get printed 
} 
+0

Keine Änderung in der Ausgabe. Immer noch die ersten Ausdrucke von dem, was gesendet werden sollte, aber ich bekomme nichts aus dem Beobachter heraus. –

+0

@deadbeef hat es geschafft. Es gibt einen Tippfehler. Verwenden Sie 'userInfo' anstelle von' object'. –

+0

Wenn ich das direkt in Copypasting, bekomme ich einen Fehler, der sagt "Mehrdeutige Verwendung von Userinfo". Es erscheint auf Autocomplete als eine Option genau wie .Objekt, so dass für mich keinen Sinn ergibt, haha. –