You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:52:31