EventKitu v Xamarin. iOS
systém iOS má vestavěnou dvě aplikace související s kalendáři: aplikace kalendáře a aplikace s připomenutími. Je dostatečně jasné, abyste pochopili, jak aplikace kalendáře spravuje data kalendáře, ale aplikace s připomenutími není méně zřejmá. K připomenutím můžou být ve skutečnosti přidružená data z hlediska jejich splnění, pokud jsou dokončená atd. V takovém případě iOS ukládá všechna data kalendáře, ať už jde o události v kalendáři nebo připomenutí, v jednom umístění, které se nazývá databáze kalendáře.
EventKitu Framework poskytuje způsob, jak získat přístup k kalendářům, událostem kalendářea datům připomenutí , které ukládá kalendář databáze. Přístup k kalendářům a událostem kalendáře byl k dispozici od verze iOS 4, ale přístup k připomenutím je v systému iOS 6 novinkou.
V této příručce se pokryje:
- Základy EventKitu – to přináší základní části EventKitu prostřednictvím hlavních tříd a poskytuje porozumění jejich využití. Tato část je povinná pro čtení, než se pustíte do další části dokumentu.
- Běžné úlohy – část běžné úlohy je určena jako rychlá referenční příručka, jak provádět běžné věci, jako je například; vytváření výčtu kalendářů, vytváření, ukládání a načítání událostí a připomenutí kalendáře a používání integrovaných řadičů pro vytváření a úpravu událostí kalendáře. Tento oddíl není nutné číst zepředu po obnovení, protože se jedná o odkaz pro konkrétní úkoly.
Všechny úlohy v této příručce jsou k dispozici v doprovodné ukázkové aplikaci:
Požadavky
EventKitu se zavedla v iOS 4,0, ale přístup k datům připomenutí byl představený v iOS 6,0. V takovém případě pro obecné EventKitu vývoj budete muset pro připomenutí cílit alespoň na verzi 4,0 a 6,0.
Kromě toho aplikace připomenutí není v simulátoru k dispozici, což znamená, že data připomenutí nebudou k dispozici, pokud je nepřidáte jako první. Žádosti o přístup se navíc zobrazují jenom uživateli na skutečném zařízení. V takovém případě je vývoj EventKitu nejlépe testován na zařízení.
Základy pro sadu Event Kit
Při práci s EventKitu je důležité mít k dispozici všechny společné třídy a jejich využití. Všechny tyto třídy lze nalézt v EventKit a EventKitUI (pro EKEventEditController ).
Eventstoru
Třída eventstoru je nejdůležitější třídou v EventKitu, protože je nutné provést všechny operace v EventKitu. Lze si představit jako trvalé úložiště nebo databázový stroj pro všechna EventKitu data. Od EventStore vás máte přístup k kalendářům a událostem kalendáře v aplikaci kalendáře i k připomenutím v aplikaci připomenutí.
Vzhledem k tomu EventStore , že se jako databázový stroj, měl by být dlouhotrvající, což znamená, že by měl být vytvořen a zničen co nejmenším možným způsobem během životnosti instance aplikace. Doporučuje se, abyste po vytvoření jedné instance aplikace EventStore v aplikaci zanechali tento odkaz na celou dobu životnosti aplikace, pokud si nejste jisti, že ji nebudete potřebovat znovu. Kromě toho by všechna volání měla jít na jednu EventStore instanci. Z tohoto důvodu se doporučuje vzor singleton, aby bylo možné udržovat jedinou instanci.
Vytváření úložiště událostí
Následující kód ilustruje účinný způsob, jak vytvořit jednu instanci EventStore třídy a zpřístupnit ji staticky v rámci aplikace:
public class App
{
public static App Current {
get { return current; }
}
private static App current;
public EKEventStore EventStore {
get { return eventStore; }
}
protected EKEventStore eventStore;
static App ()
{
current = new App();
}
protected App ()
{
eventStore = new EKEventStore ( );
}
}
Výše uvedený kód používá ke konkretizaci instance EventStore při načtení aplikace vzor singleton. V EventStore rámci aplikace lze potom použít globálně, jak je znázorněno níže:
App.Current.EventStore;
Všimněte si, že všechny příklady v tomto příkladu používají tento model, takže na něj odkazují EventStoreApp.Current.EventStore .
Požaduje se přístup k datům kalendáře a připomenutí.
Aby bylo možné získat přístup k datům přes Eventstoru, musí aplikace nejprve požádat o přístup k datům událostí kalendáře nebo k datům připomenutí v závislosti na tom, který z nich potřebujete. Pro usnadnění tohoto prvku EventStore zpřístupňuje metoda, která je volána, RequestAccess když je volána – zobrazí zobrazení výstrahy uživateli, že aplikace požaduje přístup k datům v kalendáři, nebo data připomenutí v závislosti na tom, která z nich EKEntityType je předána. Vzhledem k tomu, že vyvolává zobrazení výstrah, je volání asynchronní a volání obslužné rutiny dokončení předané jako NSAction (nebo lambda) k tomuto objektu, který získá dva parametry; logická hodnota, bez ohledu na udělení přístupu, a a NSError , která, pokud hodnota not-null, bude v požadavku obsahovat jakékoli informace o chybě. Například následující kód bude vyžadovat přístup k datům události kalendáře a zobrazit zobrazení výstrah, pokud požadavek nebyl udělen.
App.Current.EventStore.RequestAccess (EKEntityType.Event,
(bool granted, NSError e) => {
if (granted)
//do something here
else
new UIAlertView ( "Access Denied",
"User Denied Access to Calendar Data", null,
"ok", null).Show ();
} );
Po udělení žádosti se zapamatuje, dokud se aplikace nainstaluje do zařízení a neotevře se uživateli výstraha. Přístup je však poskytován pouze pro typ prostředku, buď jsou události kalendáře nebo připomenutí udělena. Pokud aplikace potřebuje přístup k oběma, měla by vyžadovat obě.
Vzhledem k tomu, že oprávnění je zapamatování, je poměrně levné na to, aby se povedl požadavek pokaždé, takže před provedením operace je vhodné vždy požádat o přístup.
Vzhledem k tomu, že obslužná rutina dokončení je volána na samostatném vlákně (bez uživatelského rozhraní), všechny aktualizace uživatelského rozhraní v obslužné rutině dokončení by měly být volány prostřednictvím InvokeOnMainThread , jinak bude vyvolána výjimka a pokud není zachycena, aplikace dojde k chybě.
EKEntityType
EKEntityType je výčet, který popisuje typ EventKit položky nebo data. Má dvě hodnoty: Event a připomenutí. Používá se v mnoha metodách, včetně informací o EventStore.RequestAccess tom, EventKit Jaký druh dat má získat přístup k nebo načíst.
EKCalendar
EKCalendar představuje kalendář, který obsahuje skupinu událostí kalendáře. kalendáře se můžou ukládat na hodně různých místech, jako je například místně, v iCloudna umístění poskytovatele třetí strany, jako je například Exchange Server nebo Googleatd. V mnoha případech se používá k oznámení , kde hledat události nebo kam je uložit.
EKEventEditController
EKEventEditController lze nalézt v oboru názvů a je vestavěným kontrolérem, který lze použít k úpravě nebo vytvoření událostí kalendáře. Podobně jako u vestavěných řadičů kamery EKEventEditController dělá těžké zvedání v zobrazení uživatelského rozhraní a manipulace s uložením.
EKEvent
EKEvent představuje událost kalendáře. EKEventA EKReminder dědí z EKCalendarItem a pole, jako například Title , Notes a tak dále.
EKReminder
EKReminder představuje položku připomenutí.
EKSpan
EKSpan je výčet, který popisuje rozsah událostí při změně událostí, které se mohou opakovat, a má dvě hodnoty: ThisEvent a FutureEvents. ThisEvent znamená, že všechny změny budou provedeny pouze pro konkrétní událost v řadě, na kterou se odkazuje, zatímco FutureEvents Tato událost a všechna budoucí opakování budou mít vliv.
Úkoly
Pro snadné použití EventKitu využití bylo rozdělené do běžných úloh, které jsou popsané v následujících částech.
Zobrazení výčtu kalendářů
Chcete-li vytvořit výčet kalendářů, které uživatel nakonfiguroval na zařízení, zavolejte na GetCalendarsEventStore a předejte typ kalendářů (připomenutí nebo události), které chcete přijmout:
EKCalendar[] calendars =
App.Current.EventStore.GetCalendars ( EKEntityType.Event );
Přidání nebo úprava události pomocí integrovaného kontroleru
EKEventEditViewController má spoustu těžkého zvedání, pokud chcete vytvořit nebo upravit událost se stejným uživatelským rozhraním, které se uživateli zobrazí při použití aplikace kalendáře:
Chcete-li jej použít, je třeba jej deklarovat jako proměnnou na úrovni třídy, aby nezískala uvolňování paměti, pokud je deklarována v rámci metody:
public class HomeController : DialogViewController
{
protected CreateEventEditViewDelegate eventControllerDelegate;
...
}
Pak ji můžete spustit: vytvořte její odkaz na, zakažte na EventStore ni delegáta EventStore a pak ji zobrazte pomocí PresentViewController :
EventKitUI.EKEventEditViewController eventController =
new EventKitUI.EKEventEditViewController ();
// set the controller's event store - it needs to know where/how to save the event
eventController.EventStore = App.Current.EventStore;
// wire up a delegate to handle events from the controller
eventControllerDelegate = new CreateEventEditViewDelegate ( eventController );
eventController.EditViewDelegate = eventControllerDelegate;
// show the event controller
PresentViewController ( eventController, true, null );
Případně, pokud chcete událost předem naplnit, můžete buď vytvořit novou událost (jak je vidět níže), nebo můžete načíst uloženou událost:
EKEvent newEvent = EKEvent.FromStore ( App.Current.EventStore );
// set the alarm for 10 minutes from now
newEvent.AddAlarm ( EKAlarm.FromDate ( DateTime.Now.AddMinutes ( 10 ) ) );
// make the event start 20 minutes from now and last 30 minutes
newEvent.StartDate = DateTime.Now.AddMinutes ( 20 );
newEvent.EndDate = DateTime.Now.AddMinutes ( 50 );
newEvent.Title = "Get outside and exercise!";
newEvent.Notes = "This is your reminder to go and exercise for 30 minutes.”;
Pokud chcete uživatelské rozhraní předem naplnit, nezapomeňte nastavit vlastnost události na řadiči:
eventController.Event = newEvent;
Pokud chcete použít existující událost, přečtěte si část jak načíst událost podle ID později.
Delegát by měl přepsat Completed metodu, která je volána řadičem, když je uživatel dokončen v dialogovém okně:
protected class CreateEventEditViewDelegate : EventKitUI.EKEventEditViewDelegate
{
// we need to keep a reference to the controller so we can dismiss it
protected EventKitUI.EKEventEditViewController eventController;
public CreateEventEditViewDelegate (EventKitUI.EKEventEditViewController eventController)
{
// save our controller reference
this.eventController = eventController;
}
// completed is called when a user eith
public override void Completed (EventKitUI.EKEventEditViewController controller, EKEventEditViewAction action)
{
eventController.DismissViewController (true, null);
}
}
}
V případě potřeby můžete v delegátu zaškrtnout akci v metodě pro úpravu události a znovu uložit nebo provést jiné akce, pokud je zrušena, etcetera:
public override void Completed (EventKitUI.EKEventEditViewController controller, EKEventEditViewAction action)
{
eventController.DismissViewController (true, null);
switch ( action ) {
case EKEventEditViewAction.Canceled:
break;
case EKEventEditViewAction.Deleted:
break;
case EKEventEditViewAction.Saved:
// if you wanted to modify the event you could do so here,
// and then save:
//App.Current.EventStore.SaveEvent ( controller.Event, )
break;
}
}
Programové vytvoření události
Chcete-li vytvořit událost v kódu, použijte pro třídu metodu Factory FromStore a nastavte na ni všechna data:
EKEvent newEvent = EKEvent.FromStore ( App.Current.EventStore );
// set the alarm for 10 minutes from now
newEvent.AddAlarm ( EKAlarm.FromDate ( DateTime.Now.AddMinutes ( 10 ) ) );
// make the event start 20 minutes from now and last 30 minutes
newEvent.StartDate = DateTime.Now.AddMinutes ( 20 );
newEvent.EndDate = DateTime.Now.AddMinutes ( 50 );
newEvent.Title = "Get outside and do some exercise!";
newEvent.Notes = "This is your motivational event to go and do 30 minutes of exercise. Super important. Do this.";
Je nutné nastavit kalendář, ve kterém má být událost uložena, ale pokud nemáte žádné předvolby, můžete použít výchozí:
newEvent.Calendar = App.Current.EventStore.DefaultCalendarForNewEvents;
Chcete-li uložit událost, zavolejte metodu SaveEvent na :
NSError e;
App.Current.EventStore.SaveEvent ( newEvent, EKSpan.ThisEvent, out e );
Po uložení bude vlastnost EventIdentifier aktualizována jedinečným identifikátorem, který lze později použít k načtení události:
Console.WriteLine ("Event Saved, ID: " + newEvent.CalendarItemIdentifier);
EventIdentifier je identifikátor GUID formátu řetězce.
Programové vytvoření připomenutí
Vytvoření připomenutí v kódu je mnohem stejné jako vytvoření události kalendáře:
EKReminder reminder = EKReminder.Create ( App.Current.EventStore );
reminder.Title = "Do something awesome!";
reminder.Calendar = App.Current.EventStore.DefaultCalendarForNewReminders;
Pro uložení volejte metodu SaveReminder na :
NSError e;
App.Current.EventStore.SaveReminder ( reminder, true, out e );
Načítání události podle ID
Chcete-li načíst událost podle ID, použijte metodu EventFromIdentifier v objektu a předejte ji do objektu EventIdentifier , který byl načten z události:
EKEvent mySavedEvent = App.Current.EventStore.EventFromIdentifier ( newEvent.EventIdentifier );
Pro události jsou k dispozici dvě další vlastnosti identifikátoru, ale EventIdentifier je to ten, který je v tomto případě vhodný.
Načítání připomenutí podle ID
Chcete-li načíst připomenutí, použijte metodu GetCalendarItem a předejte ji CalendarItemIdentifier:
EKCalendarItem myReminder = App.Current.EventStore.GetCalendarItem ( reminder.CalendarItemIdentifier );
Vzhledem k tomu GetCalendarItem , že vrací hodnotu EKCalendarItem , musí být přetypování na, EKReminder Pokud potřebujete získat přístup k datům připomenutí nebo použít instanci jako EKReminder později.
Nepoužívejte GetCalendarItem pro události kalendáře, stejně jako v době psaní, nefunguje.
Odstranění události
Chcete-li odstranit událost kalendáře, zavolejte na RemoveEvent a předejte odkaz na událost a příslušné EKSpan :
NSError e;
App.Current.EventStore.RemoveEvent ( mySavedEvent, EKSpan.ThisEvent, true, out e);
Poznámka: po odstranění události se ale odkaz na událost bude null .
Odstranění připomenutí
Pokud chcete odstranit připomenutí, zavolejte removeReminder na a předejte odkaz na připomenutí:
NSError e;
App.Current.EventStore.RemoveReminder ( myReminder as EKReminder, true, out e);
Všimněte si, že ve výše uvedeném kódu je přetypování na EKReminder , protože GetCalendarItem se použilo k jeho načtení.
Hledání událostí
Pokud chcete hledat události kalendáře, musíte vytvořit objekt NSPredicate prostřednictvím metody PredicateForEvents v objektu . je NSPredicate datový objekt dotazu, který iOS používá k vyhledání shod:
DateTime startDate = DateTime.Now.AddDays ( -7 );
DateTime endDate = DateTime.Now;
// the third parameter is calendars we want to look in, to use all calendars, we pass null
NSPredicate query = App.Current.EventStore.PredicateForEvents ( startDate, endDate, null );
Po vytvoření použijte metodu NSPredicateNSPredicate v souboru EventStore :
// execute the query
EKCalendarItem[] events = App.Current.EventStore.EventsMatching ( query );
Všimněte si, že dotazy jsou synchronní (blokující) a v závislosti na dotazu mohou trvat dlouhou dobu, takže k tomu můžete chtít spustit nové vlákno nebo úlohu.
Hledání připomenutí
Hledání připomenutí se podobá událostem. vyžaduje predikát, ale volání je už asynchronní, takže se nemusíte starat o blokování vlákna:
// create our NSPredicate which we'll use for the query
NSPredicate query = App.Current.EventStore.PredicateForReminders ( null );
// execute the query
App.Current.EventStore.FetchReminders (
query, ( EKReminder[] items ) => {
// do someting with the items
} );
Souhrn
Tento dokument poskytl přehled o důležitých částech architektury EventKit a několika nejběžnějších úlohách. Rozhraní EventKit je ale velmi velké a výkonné a zahrnuje funkce, které tu nebyly představeny, jako jsou dávkové aktualizace, konfigurace alarmů, konfigurace opakování událostí, registrace a naslouchání změnám v databázi kalendáře, nastavení geografických položek a další. Další informace najdete v Průvodci programováním kalendáře a připomenutí společnostiApple.

