Я использую SwiftUI для одного из моих предыдущих приложений, и в какой-то момент мне нужно добавить событие в календарь iOS. Проведя некоторые исследования на форумах Apple для разработчиков и Stack Overflow, я придумал следующее решение, которое использует протокол UIViewControllerRepresentable, чтобы по-прежнему иметь возможность использовать UIViewControllers с SwiftUI (вы можете найти ниже ссылки на обсуждения,для вашей справки).
Обсуждение на форумах Apple Dev: https://forums.developer.apple.com/thread/120372
Обсуждение переполнения стека: SwiftUI: Отправить письмо
I 'м почти там, но сейчас мне не хватает, это контроль статуса авторизации для доступа к календарю устройства и запуск запроса на такую авторизацию в случае необходимости.
В Swift это будет функциячтобы вызвать запрос, но я не уверен, как справиться с этим в моем EKEventWrapper.
func requestAccess(to entityType: EKEntityType,
completion: @escaping EKEventStoreRequestAccessCompletionHandler)
Любые идеи?
Спасибо большое!
Мойрешение до этого момента:
import Foundation
import SwiftUI
import EventKitUI
let eventStore = EKEventStore()
struct EKEventWrapper: UIViewControllerRepresentable {
typealias UIViewControllerType = EKEventEditViewController
@Binding var isShowing: Bool
var theEvent = EKEvent.init(eventStore: eventStore)
func makeUIViewController(context: UIViewControllerRepresentableContext<EKEventWrapper>) -> EKEventEditViewController {
let calendar = EKCalendar.init(for: .event, eventStore: eventStore)
theEvent.startDate = Date()
theEvent.endDate = Date()
theEvent.title = "Meeting"
theEvent.calendar = calendar
let controller = EKEventEditViewController()
controller.event = theEvent
controller.eventStore = eventStore
controller.editViewDelegate = context.coordinator
return controller
}
func updateUIViewController(_ uiViewController: EKEventWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<EKEventWrapper>) {
//
}
func makeCoordinator() -> Coordinator {
return Coordinator(isShowing: $isShowing)
}
class Coordinator : NSObject, UINavigationControllerDelegate, EKEventEditViewDelegate {
@Binding var isShowing: Bool
init(isShowing: Binding<Bool>) {
_isShowing = isShowing
}
func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
switch action {
case .canceled:
print("Canceled")
isShowing = false
case .saved:
print("Saved")
do {
try controller.eventStore.save(controller.event!, span: .thisEvent, commit: true)
}
catch {
print("Problem saving event")
}
isShowing = false
case .deleted:
print("Deleted")
isShowing = false
@unknown default:
print("I shouldn't be here")
isShowing = false
}
}
}
}