我有一个简单的应用程序,我想在EKEventViewController中显示一个事件。
// the button action which validates if the event store access is granted and presents the given alert if true
@IBAction func actionButtonShowPopover(_ sender: Any) {
eventStore.requestAccess(to: .event) { (granted, _) in
guard granted else { return }
let event = self.generateAndSaveEvent()
self.presentEventViewController(withEvent: event)
}
}
// creates and tries to save an sample even and returns it
private func generateAndSaveEvent() -> EKEvent {
let event = EKEvent(eventStore: eventStore)
event.title = "Event Title"
event.startDate = Date()
event.endDate = Date().addingTimeInterval(1800)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
} catch(let error) {
print(error)
}
return event
}
// displays an EKEventViewController with our newly created event within an popover
private func presentEventViewController(withEvent event: EKEvent) {
DispatchQueue.main.async {
let eventVC = EKEventViewController()
eventVC.event = event
eventVC.allowsEditing = true
eventVC.modalPresentationStyle = .popover
eventVC.popoverPresentationController?.sourceView = self.buttonShowPopover
eventVC.popoverPresentationController?.sourceRect = self.buttonShowPopover.frame.offsetBy(dx: 0, dy: -10)
eventVC.popoverPresentationController?.backgroundColor = .white
eventVC.popoverPresentationController?.permittedArrowDirections = .up
self.present(eventVC, animated: false, completion: nil)
}
}
我创建了一个事件,如上面的代码所示,并简单地在popover视图控制器中显示它。自从ios 13以来,我得到了一个不同的结果:
带有编辑按钮的iOS 12.4
iOS 13没有编辑按钮
我有没有可能错过iOS12->iOS13的更改?谢谢你的建议!
编辑按钮已移至iOS 13中的导航栏。你需要在没有popover风格的情况下展示它。
在我的应用程序中,这已经存在了一段时间,我遇到了同样的问题,编辑按钮不再出现在iOS13中。与其他用户不同,我的EKEventViewController
已经封装在导航控制器中,所以这不是问题。
经过几个小时的兔子洞,我找到了解决办法。以下是我的应用程序中出现问题的地方:
-
在打开视图之前进行调试时,我试图编辑的
EKEvent
对象没有为.eventIdentifier
设置值。仔细阅读,这个属性似乎是惰性加载的,所以不能在这里检索值表明我用来获取它的EKEvent
和EKStore
之间的链接在应用程序生命周期的某个地方丢失了。这是在iOS/Swift升级过程中引入的一个变化——我无法确定是什么变化导致了这一点。 -
通过在我第一次检索
EKEvent
时访问EKEvent.eventIdentifier
,我现在有了这个标识符供以后使用 -
在呈现EKEventViewController之前,我获取该事件的新副本,并在控制器中使用新事件:
let freshEvent = store.event(withIdentifier: staleEvent.eventIdentifier)
eventViewController.event = freshEvent