<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Just Developer Blog, заметки с тегом: EKEvent</title>
<link>http://bibobo.ru/tags/ekevent/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Создание и удаление записей в календаре (iOS)</title>
<guid isPermaLink="true">http://bibobo.ru/all/sozdanie-i-udalenie-zapisey-v-kalendare-ios/</guid>
<link>http://bibobo.ru/all/sozdanie-i-udalenie-zapisey-v-kalendare-ios/</link>
<comments>http://bibobo.ru/all/sozdanie-i-udalenie-zapisey-v-kalendare-ios/</comments>
<description>&lt;p&gt;Многие приложения используют очень полезную фишку ОС от Apple как создание кастомных записей и календарей. Сегодня мы рассмотрим пример реализации класса-хэлпера, позволяющего создавать и удалять записи в кастомном календаре.&lt;/p&gt;
&lt;p&gt;&lt;/br&gt;&lt;/p&gt;
&lt;p&gt;Вся работа с календарем строится через фреймворк EventKit, при этом последовательность действий для создания записи примерно следующая:&lt;/p&gt;
&lt;p&gt;&lt;/br&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Создать экземпляра класса EKEventStore&lt;/li&gt;
&lt;li&gt;Запросить через него разрешение на работу с календарем&lt;/li&gt;
&lt;li&gt;В completionHandler реализовать код, который будет создавать запись&lt;/li&gt;
&lt;li&gt;При создании записи необходимо сначала найти наш кастомный календарь EKCalendar (или создать его, если его еще нет)&lt;/li&gt;
&lt;li&gt;Создать экземпляр класса EKEvent (это и будет наша запись) и установить для него заголовок, сопроводительный текст, время начала и окончания&lt;/li&gt;
&lt;li&gt;Создать и добавить ремайндер (экземпляр класса EKAlarm), который описывает когда должно сработать напоминание о записи&lt;br /&gt;
&lt;input id="button_ios_manage_calendar_events" type="button" onclick="toggle(cut_ios_manage_calendar_events, button_ios_manage_calendar_events)" value="Читать дальше" hiddenText="Свернуть" visibleText="Читать дальше"&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div id="cut_ios_manage_calendar_events" style="display: none;" displayOld=""&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Более подробно можно понять, посмотрев код:&lt;/p&gt;
&lt;p&gt;&lt;/br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;public class EventKitCalendarHelper
{
    /// &amp;lt;summary&amp;gt;
    /// Имя кастомного календаря
    /// &amp;lt;/summary&amp;gt;
    public static string CalendarTitle = &amp;quot;CalendarTitle&amp;quot;;

    /// &amp;lt;summary&amp;gt;
    /// Варианты срабатывания напоминания для записи в календаре
    /// &amp;lt;/summary&amp;gt;
    public enum AlarmTime
    {
        None = 0,
        FifteenMinutesBefore = -15*60,
        HalfAnHourBefore = -30*60,
        AnHourBefore = -60*60,
        TwoHoursBefore = -2*60*60,
        ThreeHoursBefore = -3*60*60
    }

    /// &amp;lt;summary&amp;gt;
    /// Добавляет запись в календаре
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;eventTitle&amp;quot;&amp;gt;Event title.&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;dateStart&amp;quot;&amp;gt;Date start.&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;timeLength&amp;quot;&amp;gt;Time length.&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;time&amp;quot;&amp;gt;Time.&amp;lt;/param&amp;gt;
    public static void AddCalendarEvent(string eventTitle, DateTime dateStart, TimeSpan timeLength, string eventNotes = &amp;quot;&amp;quot;, AlarmTime time = AlarmTime.None)
    {
        if (string.IsNullOrEmpty(eventTitle))
        {
            return;
        }

        EKEventStore store = new EKEventStore();
        store.RequestAccess(EKEntityType.Event, (granted, err) =&amp;gt;
            {
                if (!granted)
                {
                    return;
                }

                EKEvent entry = EKEvent.FromStore(store);
                entry.Title = eventTitle;
                entry.Notes = eventNotes;
                entry.StartDate = dateStart.DateTimeToNSDate();
                entry.EndDate = dateStart.Add(timeLength).DateTimeToNSDate();

                //ищем наш кастомный календарь, если мы его не находим - создаем новый
                EKCalendar calendar = FindOrCreateCalendar(store, true);
                if(calendar == null)
                {
                    return;
                }

                entry.Calendar = calendar;

                //создаем ремайндер, если он требуется
                if (time != AlarmTime.None)
                {
                    entry.AddAlarm(EKAlarm.FromTimeInterval((int)time));
                }

                err = null;
                store.SaveEvent(entry, EKSpan.ThisEvent, out err);
            });
    }

    /// &amp;lt;summary&amp;gt;
    /// Находит или создает кастомный календарь
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;returns&amp;gt;The or create calendar.&amp;lt;/returns&amp;gt;
    /// &amp;lt;param name=&amp;quot;store&amp;quot;&amp;gt;Store.&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;createIfDoesntExist&amp;quot;&amp;gt;If set to &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; create if doesnt exist.&amp;lt;/param&amp;gt;
    private static EKCalendar FindOrCreateCalendar(EKEventStore store, bool createIfDoesntExist = false)
    {
        NSError err = null;

        EKCalendar calendar = store.Calendars.Where(x =&amp;gt; x.Title == CalendarTitle).FirstOrDefault();
        if (calendar == null &amp;amp;&amp;amp; createIfDoesntExist)
        {
            err = null;
            calendar = EKCalendar.Create(EKEntityType.Event, store);
            calendar.Title = CalendarTitle;

            EKSource localSource = store.Sources.Where(x =&amp;gt; x.SourceType == EKSourceType.Local).FirstOrDefault();
            calendar.Source = localSource;

            store.SaveCalendar(calendar, true, out err);
        }

        return calendar;
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/br&gt;&lt;/p&gt;
&lt;p&gt;С удалением событий дела обстоят интереснее. При создании события у него есть строковое поле EventIdentifier, его можно где-то сохранить и использовать позже для удаления записи. Либо можно найти все записи при помощи специальным образом сформированного предиката и удалить их. Рассмотрим второй вариант.&lt;/p&gt;
&lt;p&gt;&lt;/br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// Удаляет записи в календаре, которые соответствуют выбранному интервалу времени
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&amp;quot;dateStart&amp;quot;&amp;gt;Date start.&amp;lt;/param&amp;gt;
/// &amp;lt;param name=&amp;quot;timeLength&amp;quot;&amp;gt;Time length.&amp;lt;/param&amp;gt;
public static void RemoveCalendarEvent(DateTime dateStart, TimeSpan timeLength, string title = &amp;quot;&amp;quot;)
{
    EKEventStore store = new EKEventStore();
    store.RequestAccess(EKEntityType.Event, (granted, err) =&amp;gt;
        {
            if (!granted)
            {
                return;
            }

            //ищем наш кастомный календарь
            EKCalendar calendar = FindOrCreateCalendar(store);
            if (calendar == null)
            {
                return;
            }

            //создаем предикат для поиска эвентов в нашем календаре
            NSPredicate predicate = store.PredicateForEvents(dateStart.DateTimeToNSDate(), dateStart.Add(timeLength).DateTimeToNSDate(), new EKCalendar[]{ calendar });
            EKEvent[] entries = store.EventsMatching(predicate);

            if (entries == null || entries.Length == 0)
            {
                return;
            }

            //если нужно - профильтруем элементы календаря по заголовку
            if (!string.IsNullOrEmpty(title))
            {
                entries = entries.Where(x =&amp;gt; x.Title == title).ToArray();
            }

            if (entries == null || entries.Length == 0)
            {
                return;
            }

            //проходимся по всем найденным эвентам и удаляем их
            foreach (EKEvent entry in entries)
            {
                err = null;
                store.RemoveEvent(entry, EKSpan.ThisEvent, true, out err);
            }
        });
}&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Wed, 06 Jan 2016 18:38:03 +0300</pubDate>
</item>


</channel>
</rss>