EKEventEditViewController представлен отключенной кнопкой «Добавить» - PullRequest
1 голос
/ 09 ноября 2019

Проблема

Я представляю EKEventEditViewController представление с некоторой предопределенной информацией. Если пользователь не хочет изменять эту информацию, он должен нажать «Добавить», чтобы добавить событие в календарь.

Проблема в том, что кнопка «Добавить» по умолчанию отключена. Он включается только в том случае, если пользователь изменяет что-либо (например, имя события или календарь).

Фрагмент кода

class EventManager {

    private var eventEditViewController: EKEventEditViewController?
    private let eventStore = EKEventStore()

    func addToCalendar(_ eventData: EventData) {
        let event = createEvent(eventData)
        presentEvent(event)
    }

    private func createEvent(_ eventData: EventData) -> EKEvent {
        let event = EKEvent(eventStore: eventStore)
        event.title = "My event"
        event.startDate = Date()
        event.endDate = Date()
        event.isAllDay = true
        event.calendar = eventStore.defaultCalendarForNewEvents
        event.availability = .free
        event.addAlarm(EKAlarm.init(absoluteDate: event.startDate))
        event.url = URL(string: "http://myurl.com/")
        return event
    }

    private func presentEvent(_ event: EKEvent) {
        DispatchQueue.main.async {
            self.eventEditViewController = EKEventEditViewController()
            self.eventEditViewController!.eventStore = self.eventStore
            self.eventEditViewController!.event = event
            self.eventEditViewController!.editViewDelegate = self

            self.viewController?.present(self.eventEditViewController!, animated: true)
        }
    }

}

extension EventManager: EKEventEditViewDelegate {

    func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
        eventEditViewController?.dismiss(animated: true, completion: {
            self.delegate.finish(result: CalendarResult.fromAction(action))
        })
    }

}

EKEventEditViewController

Вот какEKEventEditViewController представлено:

imageEKEventEditViewController is presented">

Еще одна вещь

Еще одна вещь, которую я заметил, это то, что когда я удаляю старт идата окончания моего EKEvent объекта, кнопка «Добавить» включена по умолчанию.

Как я могу настроить мой EKEvent объект таким образом, чтобы он имел собственную дату начала и окончания, и в то же времявремя включения кнопки Добавить по умолчанию EKEventEditViewController?

1 Ответ

0 голосов
/ 13 ноября 2019

Это было исправлено в iOS 13.3 бета

В iOS 12.2.x : очевидно, EKEventEditViewController рассматривает ваше событие как ужесуществующее событие, а не как новое событие. Таким образом, отключение кнопки Add , поскольку без изменений, где это было сделано (ошибка Apple).

Небольшой способ доказать, что это попытка отредактировать заголовок, удалив символ, это позволит добавитьпотому что теперь он изменился с оригинала. Если вы вернете тот же самый символ, который только что удалили, он снова отключит кнопку «Добавить».

Обходной путь, который мы нашли, заключался в создании подкласса EKEventEditViewController следующим образом:

final class FixedEventEditViewController: EKEventEditViewController {
    /// Set this variable instead of the `event` property to avoid a crash on iOS 12+ when a fixed timezone is set
    var deferredEvent: EKEvent?

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if let deferredEvent = self.deferredEvent {
            // Trick iOS into thinking that the event changed so it enables the Add button on iOS 13.2.x -> Fixed starting iOS 13.3
            let titleDeferred = deferredEvent.title
            deferredEvent.title = nil
            // Set the event to the new deferred event that contains no title
            self.event = deferredEvent
            // Set the original title. This will let iOS think the event changed and enable the Add button
            self.event?.title = titleDeferred
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // This is to hide the keyboard
        self.view.endEditing(true)
    }
}
...