swift - UILocalNotification 的 userInfo 对象的符合性要求

标签 swift uilocalnotification userinfo

使用 Swift-2.2,

我想将“结构”或“类对象”传递给 UILocalNotification 的 userInfo。 (参见下面的代码说明)。

你能告诉我这个结构需要如何更改才能符合 UserInfo 的要求吗?

我读到了一些内容

a) UserInfo 不能是一个结构(但我也尝试过使用一个类 - 它也不起作用)

b)“plist 类型”一致性 --> 但我该怎么做?

c) “NSCoder”和“NSObject”一致性 --> 但我该怎么做?

我运行下面的代码时收到的错误消息是:

“无法序列化用户信息”

感谢您对此提供的任何帮助。

struct MeetingData {
    let title: String
    let uuid: String
    let startDate: NSDate
    let endDate: NSDate
}

let notification = UILocalNotification()
notification.category = "some_category"
notification.alertLaunchImage = "Logo"
notification.fireDate = NSDate(timeIntervalSinceNow: 10)
notification.alertBody = "Data-Collection Request!"
//        notification.alertAction = "I want to participate"
notification.soundName = UILocalNotificationDefaultSoundName

let myData = MeetingData(title: "myTitle",
                          uuid: "myUUID",
                     startDate: NSDate(),
                       endDate: NSDate(timeIntervalSinceNow: 10))

// that's where everything crashes !!!!!!!!!!!!!!
notification.userInfo = ["myKey": myData] as [String: AnyObject]

最佳答案

正如 UILocalNotification.userInfo 的文档所述:

You may add arbitrary key-value pairs to this dictionary. However, the keys and values must be valid property-list types; if any are not, an exception is raised.

您需要自己将数据转换为这种类型。您可能想做这样的事情:

enum Keys {
    static let title = "title"
    static let uuid = "uuid"
    static let startDate = "startDate"
    static let endDate = "endDate"
}
extension MeetingData {
    func dictionaryRepresentation() -> NSDictionary {
        return [Keys.title: title,
                Keys.uuid: uuid,
                Keys.startDate: startDate,
                Keys.endDate: endDate]
    }
    init?(dictionaryRepresentation dict: NSDictionary) {
        if let title = dict[Keys.title] as? String,
            let uuid = dict[Keys.uuid] as? String,
            let startDate = dict[Keys.startDate] as? NSDate,
            let endDate = dict[Keys.endDate] as? NSDate
        {
            self.init(title: title, uuid: uuid, startDate: startDate, endDate: endDate)
        } else {
            return nil
        }
    }
}

然后您可以使用 myData.dictionaryRepresentation() 转换为字典,并使用 MeetingData(dictionaryRepresentation: ...) 从字典转换。

关于swift - UILocalNotification 的 userInfo 对象的符合性要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37229919/

相关文章:

ios - 在另一个自定义警报或 uialertview 上方显示自定义警报

ios - 从配对的苹果 watch 启动 iPhone 应用程序

ios - 如何安排无法清除或不可移动的本地通知?

objective-c - 如何在 Swift 中从 error.userInfo 获取 ["error"] ["type"]?

c# - 收集系统和环境信息

ios - 委托(delegate)仍然为零

ios - ScrollView 不缩放和水平滚动一起吗?

ios - Swift - 来自 Parse 的表重复记录

ios - Swift读取远程通知的userInfo

ios - ( ios ) 如何从委托(delegate)中接收 didReceiveLocalNotification