【问题标题】:How do I mark a reminder as completed when Item is deleted in my Application?在我的应用程序中删除项目时,如何将提醒标记为已完成?
【发布时间】:2020-03-26 10:32:59
【问题描述】:

我有一个项目列表,这些项目也保存在本机提醒应用程序中,以及一个功能,如果它们被删除,则将提醒标记为已完成。

问题是当我删除一个项目时,应用程序崩溃了,我不知道为什么。 如果有人可以提供帮助,我将非常高兴。

列表:

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:致命错误:在展开可选值时意外发现 nil
  • 好的.. 这是一个很好的信息,可以很容易地经常调试。是哪条线?上面有吗?
  • 感谢您的回复!在这里:self.todoVM.complete(store.calendarItem(withIdentifier: todoItem.reminderidentifier ?? String()) as! EKReminder)

标签: ios swift iphone swiftui xcode11


【解决方案1】:

根据你得到的错误,你正在解开一个 nil 的东西

let todoItem = ToDoItem(context: self.context)

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

问题出在此处.. 您正在使用可能未设置的标识符进行搜索。 (创建对象后todoItem.reminderidentifier在哪里设置?)

如果未设置,则您使用的是带有String() 的空字符串。强制将其打开到 EKReminder 是行不通的。你需要以不同的方式处理它。

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 2010-12-19
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多