EKEventEditViewController Add and Cancel buttons not responding

Viewed 1583

I am trying to add a calendar event using EKEventEditViewController. I have setup a EKEventEditViewController properly with an EKEventStore, EKEvent, and its editViewDelegate as the presenting view controller. The EKEventEditViewController presents itself correctly, but when I press either 'add' or 'cancel', didCompleteWithAction does not called in EKEventEditViewDelegate. But, I do get this error (no crash though):

[EKCalendarItemLocationInlineEditItem isSubitemAtIndexSaveable:] - Location Inline Edit Item didn't have a text label on its non conference location cell; will return NO

You can see here that EKCalendarItemLocationInlineEditItem is in the EventKitUI framework.

It seems like this has something to do with location but I can't seem to figure it out. Has anyone ever encountered this error, or have any tips on how to further debug? Thanks! I am running iOS 11 and Xcode 9.0.1.

2 Answers

It looks like you did not set the editViewDelegate before presenting the EKEventEditViewController. Without the delegate, the Buttons 'add' and 'cancel' do not respond.

Creating the EventView and presenting (Swift)

let eventView: EKEventEditViewController = EKEventEditViewController()
eventView.event = event
eventView.editViewDelegate = self
eventView.eventStore = eventStore

present(eventView, animated: true) { }

ObjC

EKEventEditViewController *eventView = [[EKEventEditViewController alloc] init];
eventView.event = event;
eventView.editViewDelegate = self;
eventView.eventStore = eventStore;

[self presentViewController:eventView animated:true completion: nil];

If you already have set your delegate and are still hitting the dreaded [EventEditor] -[EKCalendarItemLocationInlineEditItem isSubitemAtIndexSaveable:] - Location Inline Edit Item didn't have a text label on its non conference location cell; will return NO, you probably haven't set EKEventEditViewController.eventStore.

Here is a working sample code showing how to configure properly EKEventEditViewController :

func showNewEvent(askPermission: Bool) {
    let store = EKEventStore()
    if askPermission {
        store.requestAccess(to: .event) { (granted, error) in
            if granted {
                DispatchQueue.main.async {
                    self.showNewEvent(askPermission: false)
                }
            }
        }
        return
    }

    let event = EKEvent(eventStore: store)
    event.title = "New event name"
    event.notes = "Some notes"
    event.availability = .busy
    event.isAllDay = ...
    event.startDate = ...
    event.endDate = ...
    event.structuredLocation = ...

    let vc = EKEventEditViewController()
    vc.event = event
    vc.eventStore = store // <-- this needs to be the same event store you used for EKEvent
    vc.editViewDelegate = self
    present(vc, animated: true, completion: nil)
}

This code is inspired by this amazing post https://dev.to/nemecek_f/how-to-use-ekeventeditviewcontroller-in-swift-to-let-user-save-event-to-ios-calendar-d8

Related