2016-05-14 14 views
0

Mit Swift-2.2Konformitätsanforderungen für userinfo Objekt von UILocalNotification

Ich mag würde eine ‚Struktur‘ oder ein ‚Klassenobjekt‘ zu userinfo eines UILocalNotification passieren. (siehe Code-Abbildung unten).

Können Sie mir sagen, wie diese Struktur geändert werden muss, um den Anforderungen der UserInfo zu entsprechen?

las ich etwas über

a) Userinfo kann nicht eine Struktur sein (aber ich habe auch mit einer Klasse versucht - es auch nicht)

b) "plist Typ" Konformität funktionierten -> aber wie würde ich das tun?

c) "NSCoder" und "NSObject" Konformität -> aber wie würde ich das tun?

Die Fehlermeldung ich den Code unten erhalten läuft:

„nicht in der Lage userinfo zu serialisiert“

Vielen Dank für jede Hilfe zu diesem Thema.

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] 

Antwort

1

Als Dokumentation für UILocalNotification.userInfo sagt:

Sie beliebige Schlüssel-Wert-Paare hinzufügen können zu diesem Wörterbuch. Die Schlüssel und Werte müssen jedoch gültig sein property-list types; Wenn dies nicht der Fall ist, wird eine Ausnahme ausgelöst.

Sie müssen Ihre Daten selbst in diesen Typ konvertieren.

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 
     } 
    } 
} 

Dann können Sie myData.dictionaryRepresentation() verwenden konvertieren in ein Wörterbuch, und MeetingData(dictionaryRepresentation: ...) aus einem Wörterbuch zu konvertieren: Sie könnte so etwas wie dies tun wollen.

+0

Dies ist eine großartige Lösung - vielen Dank! – iKK

Verwandte Themen