Swift 3中EKEventEditViewAction始终返回.cancel,未返回.saved问题
问题分析与解决方案
你遇到的核心问题是提前手动调用了eventStore.save(event, span: .thisEvent)——EKEventEditViewController的设计逻辑是让它自己处理事件的保存/取消操作,你提前持久化事件的行为彻底打乱了它的状态判断,才会出现点击取消事件仍保留、点击完成却返回cancel的异常情况。
解决步骤:
- 移除提前保存事件的代码,直接将未持久化的
EKEvent实例传入编辑控制器 - 正确设置
editViewDelegate,通过代理方法处理编辑后的结果 - 在代理方法中根据返回的
EKEventEditViewAction执行后续逻辑(比如刷新日历数据、提示用户等)
修正后的完整代码示例:
// 1. 创建未保存的事件实例 let event = EKEvent(eventStore: eventStore) event.title = "你的事件标题" event.startDate = Date() event.endDate = Date().addingTimeInterval(3600) event.calendar = eventStore.defaultCalendarForNewEvents // 2. 初始化EKEventEditViewController let controller = EKEventEditViewController() controller.event = event controller.eventStore = eventStore controller.editViewDelegate = self // 设置代理 // 3. 弹出编辑控制器 present(controller, animated: true) // 4. 实现代理方法 extension YourViewController: EKEventEditViewDelegate { func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) { dismiss(animated: true) { switch action { case .saved: print("事件已成功保存") // 这里可以添加刷新日历列表等后续操作 case .canceled: print("用户取消了事件编辑") case .deleted: print("事件已被删除") @unknown default: break } } } }
为什么原来的代码会出问题?
当你提前调用eventStore.save(event, span: .thisEvent)后,事件已经被持久化到系统日历中。此时打开EKEventEditViewController,它处理的是一个已存在的事件:
- 点击取消时,系统只会放弃本次编辑的修改,但原始事件已经提前保存了,所以不会被删除
- 点击完成时,由于事件本身已经存在,编辑控制器的状态判断逻辑出现异常,导致回调返回
.cancel而不是预期的.saved
内容的提问来源于stack exchange,提问作者Fuzail Ahmed Ansari
相关产品推荐
相关产品推荐

