Как запросить доступ к календарю при использовании SwiftUI? - PullRequest
0 голосов
/ 26 октября 2019

Я использую 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
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...