2017-01-29 9 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!]) 

、彼らは非常にヒットされ、ミス。私は、識別子を通常のStringに変更することによってコードをテストしました。すべてが正常に動作するように動作します。

新しいタスク/通知ごとに一意のIDを作成すると思っていますか?

+0

どうしたの? 「彼らは非常に打撃を受けています」とはどういう意味ですか?_問題が何であるか説明してください。とにかく、TaskManagerとは何ですか? – matt

+0

一度に1つの通知のみをキャンセルできます(複数ではありません)。通知をスケジュールする場合は、アプリを閉じてから、後でタスクを削除するためにアプリを再度開くと、通知は取り消されません。私はこれがすべてStringで完璧に動作すると言ったように、一意のIDを使用することは私の問題です。私は、それぞれのタスクに固有のIDを作成する別の方法を探しています。 – Tai

+0

"はすべてStringで完璧に動作しますが、ユニークなIDを使用することは私の問題です。"私はその意味も理解できません。識別子_は文字列なので、私はあなたが描いている区別を得られません。そしてあなたはあなたの識別子がどのように作成され、保存されているかを示していないので、あなたは何をしているのかを誰が知っていますか?これまでの質問は、少なくとも私には完全に不明です。 – 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