2016-05-14 2 views
0

Использование Swift-2.2,требования соответствия для USERINFO объекта UILocalNotification

Я хотел бы передать «» или-структуру в «объект класса» к USERINFO из в UILocalNotification. (см. рисунок ниже).

Можете ли вы рассказать мне, как эту структуру необходимо изменить, чтобы соответствовать требованиям UserInfo?

Я что-то читал о

а) UserInfo не может быть структура (но я также попытался с классом - это не сработало)

б) «типа» PLIST соответствия -> но как бы я это сделал?

c) Соответствие «NSCoder» и «NSObject» -> но как я могу это сделать?

Сообщение об ошибке я получаю запустить код ниже:

«не сериализовать USERINFO»

Спасибо за любую помощь по этому вопросу.

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] 

ответ

1

В документации по UILocalNotification.userInfo говорит:

Вы можете добавить произвольные пары ключ-значение этого словаря. Однако ключи и значения должны быть действительными property-list types; если таковые отсутствуют, возникает исключение.

Вам необходимо конвертировать ваши данные в этот тип самостоятельно. Вы можете захотеть сделать что-то вроде этого:

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: ...) конвертировать из словаря.

+0

Это отличное решение - большое вам спасибо! – iKK

Смежные вопросы