Как пометить напоминание как завершенное, когда элемент удален в моем приложении? - PullRequest
0 голосов
/ 26 марта 2020

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

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

Список:

List{
                ForEach(self.todoVM.todos, id: \.self ){todo in
                    ToDoItemView(todo: todo)
                }.onDelete{indexSet in
                    self.todoVM.deleteTodo(todoIndex: indexSet.first ?? Int())
                    let store = self.eventStore
                    let todoItem = ToDoItem(context: self.context)
                    self.todoVM.complete(store.calendarItem(withIdentifier: todoItem.reminderidentifier ?? String()) as! EKReminder)
                }

                }

функции:

func Reminders(title: String, notes: String, alarmTime: Date) {
        let todoItem = ToDoItem(context: context)
        let store = self.eventStore
        var identifier:String?
        self.eventStore.requestAccess(to: EKEntityType.reminder, completion: {
         granted, error in
         if (granted) && (error == nil) {
           print("granted \(granted)")


            let reminder:EKReminder = EKReminder(eventStore: self.eventStore)
            reminder.title = title
            //reminder.priority = Int(truncating: NSNumber(value: self.prioritized))
            //reminder.isCompleted = true

            reminder.notes = notes


            let alarmTime = alarmTime
           let alarm = EKAlarm(absoluteDate: alarmTime)
           reminder.addAlarm(alarm)

           reminder.calendar = self.eventStore.defaultCalendarForNewReminders()
            do {
             try self.eventStore.save(reminder, commit: true)
                identifier = reminder.calendarItemIdentifier 
                todoItem.reminderidentifier = identifier
           } catch {
             print("Cannot save")
             return
           }
           print("Reminder saved")
         }else{

            }
        })
    }
    func complete(_ reminder: EKReminder){
        reminder.isCompleted = true
        do {
          try self.eventStore.save(reminder, commit: true)
        } catch {
          print("Cannot save")
          return
        }
    }

1 Ответ

0 голосов
/ 26 марта 2020

Исходя из полученной ошибки, вы распаковываете что-то, что имеет значение nil

let todoItem = ToDoItem(context: self.context)

self.todoVM.complete(store.calendarItem(withIdentifier: todoItem.reminderidentifier ?? String()) as! EKReminder)

Проблема заключается здесь ... вы ищете с идентификатором, который может не быть установлен. (Где вы устанавливаете todoItem.reminderidentifier после создания объекта?)

Если он не задан, вы используете пустую строку с String(). Принудительная распаковка в EKReminder не сработает. Вы должны обращаться с этим по-другому.

...