2017-02-04 11 views
1

Я пытаюсь настроить функцию, которая принимает целое число, и планирует в будущем локальное уведомление n дней. Я получаю сообщение об ошибке, что я не могу преобразовать тип Date to DateComponents. Я не смог понять, как его преобразовать. Я нашел несколько других подобных вопросов here и here, но я не смог адаптировать эти ответы для работы на Swift 3.Преобразование даты в DateComponents в функции, чтобы запланировать локальное уведомление в Swift 3

Как я могу конвертировать Date to DateComponents? Есть ли лучший способ запланировать уведомление?

Заранее спасибо за помощь :)

Строка с ошибкой «Не удается преобразовать значение типа" дата? ожидаемым 'DateComponents' типа аргумент ":

let trigger = UNCalendarNotificationTrigger(dateMatching: fireDateOfNotification, repeats: false) 

Полная функция:

func scheduleNotification(day:Int) {  
    let date = Date() 
    let calendar = Calendar.current 
    var components = calendar.dateComponents([.day, .month, .year], from: date as Date) 
    let tempDate = calendar.date(from: components) 
    var comps = DateComponents() 

    //set future day variable 
    comps.day = day 

    //set date to fire alert 
    let fireDateOfNotification = calendar.date(byAdding: comps as DateComponents, to: tempDate!) 

    let trigger = UNCalendarNotificationTrigger(dateMatching: fireDateOfNotification, repeats: false) //THIS LINE CAUSES ERROR 

    let content = UNMutableNotificationContent() 
    content.title = "New Alert Title" 
    content.body = "Body of alert" 
    content.sound = UNNotificationSound.default() 

    let request = UNNotificationRequest(identifier: "alertNotification", content: content, trigger: trigger) 

    UNUserNotificationCenter.current().add(request) {(error) in 
     if let error = error { 
      print("Uh oh! We had an error: \(error)") 
     } 
    } 
} 

ответ

10

Я думаю, что ошибка ясно, как это может быть. UNCalendarNotificationTrigger должен быть гибким, чтобы вы могли указать «огонь триггера в следующую пятницу». Все, что вам нужно, это преобразовать следующий триггер день в DateComponents:

let n = 7 
let nextTriggerDate = Calendar.current.date(byAdding: .day, value: n, to: Date())! 
let comps = Calendar.current.dateComponents([.year, .month, .day], from: nextTriggerDate) 

let trigger = UNCalendarNotificationTrigger(dateMatching: comps, repeats: false) 
print(trigger.nextTriggerDate()) 
+0

спасибо, это исправляет ошибку и намного проще, чем мой код. Я пытался усложнить его. – tylerSF