web-dev-qa-db-ja.com

Swift=辞書のUserInfoを返す通知

Objective-Cのように辞書を返す通知がありますが、期待した結果が得られません。

以下は、通知を送信するメソッドです。実際には、日付ピッカーの結果(日付)を返しています。

@IBAction func dateOfBirthAction(sender: AnyObject) {

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

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

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

}

通知オブザーバーは次のとおりです。

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
}

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

フルソリューション

@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
}
22
Paul S.

userInfo辞書が間違っています。

あなたが持っている:

_[NSObject():selectedDateDictionary]
_

userInfoを_userInfo: selectedDateDictionary_に設定してみてください:

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

エラーは、_returnedDateOfBirth:String_のためにStringを期待しているが、[NSObject():selectedDateDictionary]を返すことを示しています

9

試してみてください辞書のみがuserInfoに渡すことができます

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

または

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