2017-01-29 14 views
0

Я планирую уведомления с уникальными идентификаторами, поэтому мне не нужно создавать новую строку для каждого уведомления. Все это хорошо работает для планирования, но проблема заключается в попытке отменить их.Уникальный идентификатор для уведомлений о планировании, Swift 3 iOS 10

Это мой код для уведомлений планирования ...

let notifIdentifier = TaskManager.notification2.userInfo.description as String! 
    let trigger = UNCalendarNotificationTrigger(dateMatching: components , repeats: true) 
    let request = UNNotificationRequest(identifier: notifIdentifier! , content: TaskManager.notification2, trigger: trigger) 
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 

Это код для отмены уведомлений ...

// Deletion of Cells ... 

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 

    let managedObject: NSManagedObject = frc.object(at: indexPath) as! NSManagedObject 
    context.delete(managedObject) 
    if tableView == TaskTableViews { 
    let itemController = TaskManager() 
    let nItem: List = frc.object(at: indexPath) as! List 
    itemController.nItem = nItem 
    UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [itemController.notifIdentifier!]) 

Когда я пытаюсь отменить их, они очень хит и Мисс. Я протестировал код, изменив идентификатор на регулярную строку, и все работает так, как и должно быть, это определенно уникальный идентификатор.

Любые мысли/предложения по созданию уникального идентификатора для каждой новой задачи/уведомления?

+0

В чем проблема? Что означает «они очень поражены и промахиваются» даже _mean? _ Объясните, в чем проблема, пожалуйста. Что такое TaskManager, так или иначе? – matt

+0

Только одно уведомление может быть отменено одновременно (не многократно). Если вы планируете уведомление, закройте приложение, а затем снова откройте приложение для удаления задачи, уведомление не будет отменено. Как я уже сказал, все работает отлично со String, но использование уникального идентификатора - моя проблема. Я ищу другой способ создания уникальных идентификаторов для каждой задачи. – Tai

+0

«все отлично работает со строкой, но с использованием уникального идентификатора - моя проблема». Я не могу понять, что это значит. Идентификатор _is_ a String, поэтому я не понимаю, какое различие вы рисуете. И вы не показывали, как ваши идентификаторы создаются и сохраняются, поэтому кто знает, что вы делаете? Весь вопрос до сих пор совершенно неясен (по крайней мере, для меня). – matt

ответ

0

Планирование уведомлений

@IBAction func scheduleNotification(_ sender: AnyObject) { 

    let uuid = UUID().uuidString 


    let content = UNMutableNotificationContent() 
    content.title = NSString.localizedUserNotificationString(forKey: "Example", arguments: nil) 
    content.sound = UNNotificationSound.default() 
    //... 

    var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self.datePicker.date) 
    dateComponents.second = 0 

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

    let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger) 

    UNUserNotificationCenter.current().add(request) { (error) in 

     if let errorPerforms = error { 
     print(errorPerforms.localizedDescription) 
     } else { 
     print("Success") 
     } 
    } 


    let managedObject = ManagedObject(context: self.managedObjectContext!) 
    managedObject.setValue(uuid, forKey: "uuid") 
    //... 

    do { 
    try self.managedObjectContext.save() 
     self.dimiss() 
    } catch {} 
} 

Удаление уведомлений от indexPath.

// Override to support editing the table view. 
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 

    switch editingStyle { 
    case .delete: 

     let managedObject = self.fetchedResultsController.object(at: indexPath) 
     self.managedObjectContext.delete(managedObject) 

     let center = UNUserNotificationCenter.current() 
     center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!]) 
     center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!]) 

     do { 
     try self.managedObjectContext.save() 
      self.tableView.reloadData() 
     } catch {} 

    default: 
     break 
    } 

} 

Это хорошо работает! Когда вы используете методы протокола NSFetchedResultsControllerDelegate. Надеюсь, это поможет

+0

К сожалению, это не сработало для меня. Могу ли я связаться с вами, чтобы обсудить его дальше? – Tai

+0

Хорошо! Как я могу помочь? – Mannopson

+1

Спасибо, я получил его! – Tai

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

  • Нет связанных вопросов^_^