EKEventViewController 不会在 iOS 13 上显示编辑按钮
EKEventViewController wont show Edit Button on iOS 13
我有一个简单的应用程序,我想在其中显示 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)
}
}
我创建了一个事件,如上面的代码所示,并简单地在弹出视图控制器中显示它。因为 ios 13 我得到了不同的结果:
iOS 12.4 with edit button
iOS 13 without edit button
我是否有可能遗漏 iOS12 -> iOS13 的更改?
预先感谢 - 我很感激任何建议!
iOS13 中的编辑按钮已移至导航栏。您需要以无弹出式的方式呈现它。
在我的应用程序中,它已经存在了一段时间,我遇到了同样的问题,编辑按钮不再出现在 iOS13 中。与其他用户不同,我的 EKEventViewController
已经包含在导航控制器中,所以不是那个问题。
经过几个小时的探索,我找到了解决方法。这是我的应用中出现问题的地方:
在打开视图之前调试,我试图编辑的 EKEvent
对象没有为 .eventIdentifier
设置值。读到这里,似乎这个 属性 是延迟加载的,所以无法在此处检索值表明 EKEvent
和 EKStore
之间的 link 我曾经获取它已经丢失在应用程序生命周期的某个地方。这是 iOS/Swift 升级过程中某处引入的更改 - 我无法确定导致此问题的更改。
通过在我第一次检索 EKEvent
时访问 EKEvent.eventIdentifier
,我现在有了这个标识符供以后使用
在展示 EKEventViewController 之前,我获取了该事件的新副本并在控制器中使用了新事件:
let freshEvent = store.event(withIdentifier: staleEvent.eventIdentifier)
eventViewController.event = freshEvent
我有一个简单的应用程序,我想在其中显示 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)
}
}
我创建了一个事件,如上面的代码所示,并简单地在弹出视图控制器中显示它。因为 ios 13 我得到了不同的结果:
iOS 12.4 with edit button
iOS 13 without edit button
我是否有可能遗漏 iOS12 -> iOS13 的更改? 预先感谢 - 我很感激任何建议!
iOS13 中的编辑按钮已移至导航栏。您需要以无弹出式的方式呈现它。
在我的应用程序中,它已经存在了一段时间,我遇到了同样的问题,编辑按钮不再出现在 iOS13 中。与其他用户不同,我的 EKEventViewController
已经包含在导航控制器中,所以不是那个问题。
经过几个小时的探索,我找到了解决方法。这是我的应用中出现问题的地方:
在打开视图之前调试,我试图编辑的
EKEvent
对象没有为.eventIdentifier
设置值。读到这里,似乎这个 属性 是延迟加载的,所以无法在此处检索值表明EKEvent
和EKStore
之间的 link 我曾经获取它已经丢失在应用程序生命周期的某个地方。这是 iOS/Swift 升级过程中某处引入的更改 - 我无法确定导致此问题的更改。通过在我第一次检索
EKEvent
时访问EKEvent.eventIdentifier
,我现在有了这个标识符供以后使用在展示 EKEventViewController 之前,我获取了该事件的新副本并在控制器中使用了新事件:
let freshEvent = store.event(withIdentifier: staleEvent.eventIdentifier)
eventViewController.event = freshEvent