Добавить событие в календарь в xcode iOS

Hy

У меня есть этот код для добавления событий в календарь, но он не добавляется.

-(void)event
{
    EKEventStore *eventStore = [[EKEventStore alloc] init];

    EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
    event.title     = @"Event";


    NSDateFormatter *tempFormatter = [[NSDateFormatter alloc]init];
    [tempFormatter setDateFormat:@"dd.MM.yyyy HH:mm"];


    NSString *dateandtime =[NSString stringWithFormat:@"%@%@%@",datestring,@" ",starttimestring];
    NSString *dateandtimeend =[NSString stringWithFormat:@"%@%@%@",datestring,@" ",endtimestring];



    event.startDate = [tempFormatter dateFromString:dateandtime];
    event.endDate = [tempFormatter dateFromString:dateandtimeend];


    [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -60.0f * 24]];
    [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -15.0f]];

    [event setCalendar:[eventStore defaultCalendarForNewEvents]];
    NSError *err;
    [eventStore saveEvent:event span:EKSpanThisEvent error:&err];
}

Из XML я получаю дату и время в этом формате:

дата: 28.10.2012

время начала: 15:00


person WildWorld    schedule 26.10.2012    source источник
comment
перед сохранением убедитесь, что ваши startDate и endDate действительные даты   -  person Maulik    schedule 26.10.2012
comment
Когда я NSlog dateandtime и dateandtimeend у меня в этом формате 28.10.2012 15:00 такой же, как формат даты   -  person WildWorld    schedule 26.10.2012
comment
Это (ноль), когда я NSlog event.startDate у меня есть в этом формате 2012-10-28 13:00:00 +0000 ???   -  person WildWorld    schedule 26.10.2012


Ответы (2)


Вы используете симулятор iOS 6 или устройство с iOS 6? Если это так, вам нужно запросить у пользователя разрешение на использование хранилища событий, прежде чем вы сможете сохранять в нем элементы.

По сути, если селектор requestAccessToEntityType:completion: доступен в вашем объекте хранилища событий, вы вызываете этот метод и предоставляете блок кода, который выполняется, когда пользователь предоставляет разрешение, и затем вы должны сохранить свое событие в этом блоке.

Сначала добавьте фреймворк EventKit в свой проект и не забудьте включить импорт:

#import <EventKit/EventKit.h>

Вот фрагмент кода, который я использовал, который работал для меня:

EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
    // the selector is available, so we must be on iOS 6 or newer
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (error)
            {
                // display error message here
            }
            else if (!granted)
            {
                // display access denied error message here
            }
            else
            {
                // access granted
                // ***** do the important stuff here *****
            }
        });
    }];
}
else
{
    // this code runs in iOS 4 or iOS 5
    // ***** do the important stuff here *****
}

[eventStore release];

Вот сообщение в блоге, которое я сделал на эту тему:

http://www.dosomethinghere.com/2012/10/08/ios-6-calendar-and-address-book-issues/

person BP.    schedule 26.10.2012
comment
спасибо :) на данный момент это работает нормально. Я свяжусь с вами как можно скорее, я протестирую его на iPhone. у меня вопрос, что еще в конце кода хорошо? я знаю первое, если еще, если и еще. насчет последнего не уверен. - person WildWorld; 27.10.2012
comment
Я отредактировал приведенный выше код, чтобы объяснить, что происходит. Другая часть будет работать, если приложение работает на iOS 4 или 5, как и в этих версиях ОС, этот селектор набора событий не будет существовать, и вы все равно захотите, чтобы ваши важные вещи были выполнены в этом экземпляре. - person BP.; 29.10.2012
comment
И, конечно же, если это работает для вас, вы всегда можете нажать на галочку слева от ответа, чтобы принять его. ;Д - person BP.; 29.10.2012
comment
Большое спасибо, но что мне нужно добавить, чтобы зазвучал будильник для моего мероприятия? И если можно, как добавить кастомный звук будильника для события? - person lenhhoxung; 11.11.2013

1) добавить структуру Eventkit и #import <EventKit/EventKit.h>

2)

 -(void)syncWithCalendar {
    EKEventStore *store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = @"Event Title Testing"; //give event title you want
        event.startDate = [NSDate date];
        event.endDate = [event.startDate dateByAddingTimeInterval:60*60];
        event.calendar = [store defaultCalendarForNewEvents];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
    }];
}

3) функция вызова

[self syncWithCalendar];
person Hardik Thakkar    schedule 25.04.2016