{"version":"https:\/\/jsonfeed.org\/version\/1","title":"Just Developer Blog, \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0441 \u0442\u0435\u0433\u043e\u043c: EKCalendar","home_page_url":"http:\/\/bibobo.ru\/tags\/ekcalendar\/","feed_url":"http:\/\/bibobo.ru\/tags\/ekcalendar\/json\/","icon":false,"author":{"name":"\u0415\u0432\u0433\u0435\u043d\u0438\u0439 \u0418\u0432\u043e\u043d (Evgeniy Ivon)","url":"http:\/\/bibobo.ru\/","avatar":false},"items":[{"id":"28","url":"http:\/\/bibobo.ru\/all\/sozdanie-i-udalenie-zapisey-v-kalendare-ios\/","title":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u00a0\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u00a0\u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435 (iOS)","content_html":"<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0444\u0438\u0448\u043a\u0443 \u041e\u0421 \u043e\u0442\u00a0Apple \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u00a0\u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435\u0439. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430-\u0445\u044d\u043b\u043f\u0435\u0440\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u00a0\u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u00a0\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435.<\/p>\n<p><\/br><\/p>\n<p>\u0412\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a EventKit, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<p><\/br><\/p>\n<ol start=\"1\">\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 EKEventStore<\/li>\n<li>\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0\u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u00a0\u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435\u043c<\/li>\n<li>\u0412\u00a0completionHandler \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c<\/li>\n<li>\u041f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c EKCalendar (\u0438\u043b\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0435\u0449\u0435 \u043d\u0435\u0442)<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 EKEvent (\u044d\u0442\u043e \u0438\u00a0\u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448\u0430 \u0437\u0430\u043f\u0438\u0441\u044c) \u0438\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u044f\u00a0\u043d\u0435\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u00a0\u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u043c\u0430\u0439\u043d\u0434\u0435\u0440 (\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 EKAlarm), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u043e\u00a0\u0437\u0430\u043f\u0438\u0441\u0438<br \/>\n<input id=\"button_ios_manage_calendar_events\" type=\"button\" onclick=\"toggle(cut_ios_manage_calendar_events, button_ios_manage_calendar_events)\" value=\"\u0427\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435\" hiddenText=\"\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c\" visibleText=\"\u0427\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435\"><\/li>\n<\/ol>\n<div id=\"cut_ios_manage_calendar_events\" style=\"display: none;\" displayOld=\"\"><p><\/p>\n<p><br><\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043a\u043e\u0434:<\/p>\n<p><\/br><\/p>\n<pre class=\"e2-text-code\"><code>public class EventKitCalendarHelper\r\n{\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u0418\u043c\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f\r\n    \/\/\/ &lt;\/summary&gt;\r\n    public static string CalendarTitle = &quot;CalendarTitle&quot;;\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435\r\n    \/\/\/ &lt;\/summary&gt;\r\n    public enum AlarmTime\r\n    {\r\n        None = 0,\r\n        FifteenMinutesBefore = -15*60,\r\n        HalfAnHourBefore = -30*60,\r\n        AnHourBefore = -60*60,\r\n        TwoHoursBefore = -2*60*60,\r\n        ThreeHoursBefore = -3*60*60\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435\r\n    \/\/\/ &lt;\/summary&gt;\r\n    \/\/\/ &lt;param name=&quot;eventTitle&quot;&gt;Event title.&lt;\/param&gt;\r\n    \/\/\/ &lt;param name=&quot;dateStart&quot;&gt;Date start.&lt;\/param&gt;\r\n    \/\/\/ &lt;param name=&quot;timeLength&quot;&gt;Time length.&lt;\/param&gt;\r\n    \/\/\/ &lt;param name=&quot;time&quot;&gt;Time.&lt;\/param&gt;\r\n    public static void AddCalendarEvent(string eventTitle, DateTime dateStart, TimeSpan timeLength, string eventNotes = &quot;&quot;, AlarmTime time = AlarmTime.None)\r\n    {\r\n        if (string.IsNullOrEmpty(eventTitle))\r\n        {\r\n            return;\r\n        }\r\n\r\n        EKEventStore store = new EKEventStore();\r\n        store.RequestAccess(EKEntityType.Event, (granted, err) =&gt;\r\n            {\r\n                if (!granted)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                EKEvent entry = EKEvent.FromStore(store);\r\n                entry.Title = eventTitle;\r\n                entry.Notes = eventNotes;\r\n                entry.StartDate = dateStart.DateTimeToNSDate();\r\n                entry.EndDate = dateStart.Add(timeLength).DateTimeToNSDate();\r\n\r\n                \/\/\u0438\u0449\u0435\u043c \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c - \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439\r\n                EKCalendar calendar = FindOrCreateCalendar(store, true);\r\n                if(calendar == null)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                entry.Calendar = calendar;\r\n\r\n                \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0435\u043c\u0430\u0439\u043d\u0434\u0435\u0440, \u0435\u0441\u043b\u0438 \u043e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f\r\n                if (time != AlarmTime.None)\r\n                {\r\n                    entry.AddAlarm(EKAlarm.FromTimeInterval((int)time));\r\n                }\r\n\r\n                err = null;\r\n                store.SaveEvent(entry, EKSpan.ThisEvent, out err);\r\n            });\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c\r\n    \/\/\/ &lt;\/summary&gt;\r\n    \/\/\/ &lt;returns&gt;The or create calendar.&lt;\/returns&gt;\r\n    \/\/\/ &lt;param name=&quot;store&quot;&gt;Store.&lt;\/param&gt;\r\n    \/\/\/ &lt;param name=&quot;createIfDoesntExist&quot;&gt;If set to &lt;c&gt;true&lt;\/c&gt; create if doesnt exist.&lt;\/param&gt;\r\n    private static EKCalendar FindOrCreateCalendar(EKEventStore store, bool createIfDoesntExist = false)\r\n    {\r\n        NSError err = null;\r\n\r\n        EKCalendar calendar = store.Calendars.Where(x =&gt; x.Title == CalendarTitle).FirstOrDefault();\r\n        if (calendar == null &amp;&amp; createIfDoesntExist)\r\n        {\r\n            err = null;\r\n            calendar = EKCalendar.Create(EKEntityType.Event, store);\r\n            calendar.Title = CalendarTitle;\r\n\r\n            EKSource localSource = store.Sources.Where(x =&gt; x.SourceType == EKSourceType.Local).FirstOrDefault();\r\n            calendar.Source = localSource;\r\n\r\n            store.SaveCalendar(calendar, true, out err);\r\n        }\r\n\r\n        return calendar;\r\n    }\r\n}<\/code><\/pre><p><\/br><\/p>\n<p>\u0421\u00a0\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u0435\u043b\u0430 \u043e\u0431\u0441\u0442\u043e\u044f\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u041f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u00a0\u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 EventIdentifier, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0434\u043b\u044f\u00a0\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438. \u041b\u0438\u0431\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u0438\u00a0\u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 \u0438\u00a0\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/p>\n<p><\/br><\/p>\n<pre class=\"e2-text-code\"><code>\/\/\/ &lt;summary&gt;\r\n\/\/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\r\n\/\/\/ &lt;\/summary&gt;\r\n\/\/\/ &lt;param name=&quot;dateStart&quot;&gt;Date start.&lt;\/param&gt;\r\n\/\/\/ &lt;param name=&quot;timeLength&quot;&gt;Time length.&lt;\/param&gt;\r\npublic static void RemoveCalendarEvent(DateTime dateStart, TimeSpan timeLength, string title = &quot;&quot;)\r\n{\r\n    EKEventStore store = new EKEventStore();\r\n    store.RequestAccess(EKEntityType.Event, (granted, err) =&gt;\r\n        {\r\n            if (!granted)\r\n            {\r\n                return;\r\n            }\r\n\r\n            \/\/\u0438\u0449\u0435\u043c \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c\r\n            EKCalendar calendar = FindOrCreateCalendar(store);\r\n            if (calendar == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u0432\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435\r\n            NSPredicate predicate = store.PredicateForEvents(dateStart.DateTimeToNSDate(), dateStart.Add(timeLength).DateTimeToNSDate(), new EKCalendar[]{ calendar });\r\n            EKEvent[] entries = store.EventsMatching(predicate);\r\n\r\n            if (entries == null || entries.Length == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            \/\/\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e - \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443\r\n            if (!string.IsNullOrEmpty(title))\r\n            {\r\n                entries = entries.Where(x =&gt; x.Title == title).ToArray();\r\n            }\r\n\r\n            if (entries == null || entries.Length == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            \/\/\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u043c \u044d\u0432\u0435\u043d\u0442\u0430\u043c \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0445\r\n            foreach (EKEvent entry in entries)\r\n            {\r\n                err = null;\r\n                store.RemoveEvent(entry, EKSpan.ThisEvent, true, out err);\r\n            }\r\n        });\r\n}<\/code><\/pre>","date_published":"2016-01-06T18:38:03+03:00","date_modified":"2016-01-06T18:37:59+03:00","_date_published_rfc2822":"Wed, 06 Jan 2016 18:38:03 +0300","_rss_guid_is_permalink":"true","_rss_guid":"http:\/\/bibobo.ru\/all\/sozdanie-i-udalenie-zapisey-v-kalendare-ios\/","_e2_data":{"is_favourite":false,"links_required":["system\/library\/highlight\/highlight.js","system\/library\/highlight\/highlight.css","system\/library\/highlight\/highlight.js","system\/library\/highlight\/highlight.css"],"og_images":[]}}],"_e2_version":3254,"_e2_ua_string":"E2 (v3254; Aegea)"}