2016-05-14 6 views
0

Utilisation Swift-2.2,exigences de conformité pour objet userInfo de UILocalNotification

Je voudrais passer un « struct » ou un « objet de classe » à userInfo d'un UILocalNotification. (voir code-illustration ci-dessous).

Pouvez-vous me dire comment cette structure doit être modifiée pour être conforme aux exigences de UserInfo?

Je lis quelque chose sur

a) UserInfo ne peut pas être un struct (mais j'ai aussi essayé avec une classe - il ne fonctionne pas non plus)

b) "type plist" conformité -> mais comment le ferais-je?

c) Conformité "NSCoder" et "NSObject" -> mais comment le ferais-je?

Le message d'erreur que je reçois l'exécution du code ci-dessous:

« incapable de sérialisation userInfo »

Merci pour toute aide à ce sujet.

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] 

Répondre

1

Comme la documentation UILocalNotification.userInfo dit:

Vous pouvez ajouter des paires arbitraires valeur clé de ce dictionnaire. Cependant, les clés et les valeurs doivent être valides property-list types; Si ce n'est pas le cas, une exception est levée.

Vous aurez besoin de convertir vos données à ce type vous-même. Vous voudrez peut-être faire quelque chose comme ceci:

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

Ensuite, vous pouvez utiliser myData.dictionaryRepresentation() pour convertir un dictionnaire, et MeetingData(dictionaryRepresentation: ...) convertir un dictionnaire.

+0

Ceci est une excellente solution - merci beaucoup! – iKK