簡體   English   中英

EKEventEditViewController 顯示一個禁用的添加按鈕

[英]EKEventEditViewController is presented with a disabled Add button

問題

我正在展示一個帶有一些預定義信息的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的呈現方式:

<code>EKEventEditViewController</code> 是如何呈現的

還有一件事

我注意到的另一件事是,當我從EKEvent object 中刪除開始和結束日期時,默認情況下會啟用添加按鈕。

如何配置我的EKEvent object,使其具有自定義的開始和結束日期,同時默認啟用EKEventEditViewController的添加按鈕?

這已在 iOS 13.3 beta 上修復

在 iOS 12.2.x 上:顯然EKEventEditViewController將您的事件視為已經存在的事件,而不是新事件。 因此禁用“添加”按鈕,因為沒有進行任何更改(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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM