Notifica in Swift di ritorno UserInfo nel dizionario

Ho una Notifica che restituisce un dizionario, come in objective-c, ma non sto ottenendo i risultati che mi aspetto.

Qui è il metodo di invio della Notifica. In realtà la restituzione dei risultati (data) del selettore data.

@IBAction func dateOfBirthAction(sender: AnyObject) {

    println("Date: \(dateOfBirthPicker.date)")

    var selectedDateDictionary = [dateOfBirthPicker.date, "dateOfBirth"]

    NSNotificationCenter.defaultCenter().postNotificationName("dateOfBirth", object: nil, userInfo: [NSObject():selectedDateDictionary])

}

Qui è la notifica osservatore:

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "dateOfBirth:", name: "dateOfBirth", object: nil)

}

func dateOfBirth(notification: NSNotification) {

    println("userInfo: \(notification.userInfo)")

    let returnedDateOfBirth = notification.userInfo!["dateOfBirth"] as NSString
    println("returnedDateOfBirth: \(returnedDateOfBirth)")

    playerInformationDateOfBirthLabel.text  = returnedDateOfBirth
}

Ricevo il seguente errore sulla linea linea let returnedDateOfBirth:String = notification.userInfo["dateOfBirth"]

userInfo: Optional([<NSObject: 0x7fb15a44a880>: <_TtCSs23_ContiguousArrayStorage00007FB15A4D4380 0x7fb15a4206a0>(
2014-09-18 12:07:07 +0000,
dateOfBirth
)
])
fatal error: unexpectedly found nil while unwrapping an Optional value

SOLUZIONE COMPLETA

@IBAction func dateOfBirthAction(sender: AnyObject) {

    var selectedDateDictionary = ["birthDate" : dateOfBirthPicker.date]

    NSNotificationCenter.defaultCenter().postNotificationName("foundABirthDate", object: nil, userInfo:selectedDateDictionary)
}

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "dateOfBirth:", name: "foundABirthDate", object: nil)

}

func dateOfBirth(notification: NSNotification) {

    let playerBirthDate = notification.userInfo!["birthDate"] as NSDate

    var dateFormatter: NSDateFormatter = NSDateFormatter()

    //Specifies a long style, typically with full text, such as “November 23, 1937”.
    dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle

    let dateConvertedToString: String = dateFormatter.stringFromDate(playerBirthDate)

    playerInformationDateOfBirthLabel.text  = dateConvertedToString
}
InformationsquelleAutor Paul S. | 2014-09-19



2 Replies
  1. 9

    Tuo userInfo dizionario è sbagliato.

    Si dispone di:

    [NSObject():selectedDateDictionary]

    Provare a impostare userInfo per userInfo: selectedDateDictionary come questo:

    NSNotificationCenter.defaultCenter().postNotificationName("dateOfBirth", object: nil, userInfo: selectedDateDictionary)

    L’errore ti dice che sono in attesa di un String a causa di returnedDateOfBirth:String ma si torna [NSObject():selectedDateDictionary]

    • Il tuo suggerimento (come ho inizialmente fatto) dà un errore: argomento Extra “userInfo” in chiamata
    • Che cosa è l’errore? Inoltre, ho appena notato che il vostro selectedDateDictionary non è istanziato correttamente. Se si desidera un dizionario che devi fare var selectedDateDictionary = ["dateOfBirth": dateOfBirthPicker.date]
    • Grande grazie, risolto il problema con il dizionario e postNotificationName. Tuttavia, ora mi sto un EXC_BREAKPOINT sul let returnedDateOfBirth = notification.userInfo!["dateOfBirth"] as NSString linea
    • oggetto di uso. NSNotificationCenter.defaultCenter().postNotificationName(“datadinascita”, oggetto: pageDict, userInfo: nil)
    • Ora che il 1 ° errore è andato cosa println("userInfo: \(notification.userInfo)") mostrare?
    • userInfo: Optional([dateOfBirth: 2014-09-17 12:27:47 +0000])
    • Rompere in 2 righe e controllare di nuovo. Cosa let returnedDateOfBirth = notification.userInfo stampa? Rimuovere il !["dateOfBirth"] as NSString e stampare returnedDateOfBirth. Quindi ispezionare returnedDateOfBirth. In sostanza, si dovrebbe continuare a rompere le cose fino ad identificare l’origine del problema.
    • Un po ‘ di fortuna con il problema?
    • returnedDateOfBirth: Optional([dateOfBirth: 2014-09-18 12:54:47 +0000])
    • Questo è un bene. In modo che corrisponda userInfo come previsto. Ora, prova di stampa returnedDateOfBirth["dateOfBirth"]. Confermare l’hai ancora lo stesso errore.
    • Sembra che siamo tornati da dove siamo partiti. Non è possibile println chiave di dizionario, quindi devo fare questo let sample = returnedDateOfBirth!["dateOfBirth"] as NSString println("\(sample)") ancora una Volta si blocca con un EXC_BREAKPOINT
    • Invece di dateOfBirthPicker.date per il valore di prova “stringa di prova” quando si crea il dizionario. Cosa succede? Sei sicuro che dateOfBirthPicker.date è in realtà un NSString?
    • dateOfBirthPicker.date è un NSdate. Così le operazioni seguenti per risolvere il mio problema: let sample = returnedDateOfBirth!["birthDate"] as NSDate Grazie per il vostro aiuto.
    • Felici di aiutarti! Felice che hai risolto.

  2. 2

    Provare
    Solo dizionario può passare a userInfo

            var pageDict: Dictionary<String,String>! = [
                "dateOfBirth": "11/5/1987date",
            ]
            NSNotificationCenter.defaultCenter().postNotificationName("dateOfBirth", object: nil, userInfo: pageDict)

    o

         NSNotificationCenter.defaultCenter().postNotificationName("dateOfBirth", object: pageDist, userInfo: nil)

Lascia un commento