İPhone Takvim'e programlı olarak özel etkinlik ekleme


Yanıtlar:


166

Dayanarak Elma Belgeleri , bu iOS 6.0 itibariyle biraz değişti.

1) Kullanıcının takvimine "requestAccessToEntityType: completion:" üzerinden erişim talep etmeli ve bir blok içinde olay işlemeyi gerçekleştirmelisiniz.

2) Etkinliğinizi şimdi yapmanız veya kaydetme / kaldırma çağrınıza "taahhüt" parametresini geçirmeniz gerekiyor

Diğer her şey aynı kalır ...

EventKit çerçevesini ve kodunuza ekleyin #import <EventKit/EventKit.h>.

Örneğimde bir NSString * savedEventId örnek özelliği var.

Etkinlik eklemek için:

    EKEventStore *store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = @"Event Title";
        event.startDate = [NSDate date]; //today
        event.endDate = [event.startDate dateByAddingTimeInterval:60*60];  //set 1 hour meeting
        event.calendar = [store defaultCalendarForNewEvents];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
        self.savedEventId = event.eventIdentifier;  //save the event id if you want to access this later
    }];

Etkinliği kaldır:

    EKEventStore* store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId];
        if (eventToRemove) {
            NSError* error = nil;
            [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
        }
    }];

Bu, varsayılan takviminize etkinlikler ekler, birden fazla takviminiz varsa hangisinin olduğunu öğreneceksiniz

Hızlı sürüm

EventKit çerçevesini içe aktarmanız gerekir

import EventKit

Etkinlik ekle

let store = EKEventStore()
store.requestAccessToEntityType(.Event) {(granted, error) in
    if !granted { return }
    var event = EKEvent(eventStore: store)
    event.title = "Event Title"
    event.startDate = NSDate() //today
    event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting
    event.calendar = store.defaultCalendarForNewEvents
    do {
        try store.saveEvent(event, span: .ThisEvent, commit: true)
        self.savedEventId = event.eventIdentifier //save event id to access this particular event later
    } catch {
        // Display error to user
    }
}

Etkinliği kaldır

let store = EKEventStore()
store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
    if !granted { return }
    let eventToRemove = store.eventWithIdentifier(self.savedEventId)
    if eventToRemove != nil {
        do {
            try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true)
        } catch {
            // Display error to user
        }
    }
}

6
benim için çalışmıyor, her şey w / o hataları gider ama takvimde etkinlik yok
Boris Gafurov

Her şey ekevent nesnesinde saklanıyor ama takvim içinde saklamıyor beni

1
@William T: Takvim uygulamasının Etkinlik Ekle ekranını (URL Şemasını kullanarak) sunabilir ve Etkinlik Ekle ekranı görüntülendiğinde önceden doldurulmuş verilere sahip olacak şekilde etkinlik bilgilerini iletebilir miyim. Kullanıcının olay ekle düğmesine basması yeterlidir. Örnek etkinliğinizde kullanıcıya herhangi bir gösterge olmadan eklenmiştir.
Ans

1
hepsi çalışıyor gibi görünüyor, ancak hiçbir takvim görünmüyorsa, sorunun Cloud VS Local takvimlerinin olup olmadığını kontrol edin. Bulut ve Yerel Takvimlerin bir karışımınız varsa, Bulut takvimleri yerel takvimleri gizlenmeye zorlayabilir.
zonabi

2
@ReddyBasha olayı eklediğinizde, eventIdentifier'ı kaydetmeniz ve ileride kullanmak üzere saklamanız gerekir. Kaldırmaya giderken o olay kimliğini kullanmalısınız.
William T.

154

Bunu, OS 4.0'daki Olay Seti çerçevesini kullanarak yapabilirsiniz.

Pencerenin solundaki Gruplar ve Dosyalar Gezgininde FrameWorks grubuna sağ tıklayın. 'Ekle'yi, ardından' Mevcut FrameWorks'ü, ardından 'EventKit.Framework'u seçin.

O zaman böyle bir kod içeren olaylar ekleyebilmelisiniz:

#import "EventTestViewController.h"
#import <EventKit/EventKit.h>

@implementation EventTestViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    EKEventStore *eventStore = [[EKEventStore alloc] init];

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

    event.startDate = [[NSDate alloc] init];
    event.endDate   = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];

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

@end

18
Bunu gönderdiğiniz için teşekkürler. Bunu okuyan herkese sadece bir hatırlatma: bellek sızıntılarına dikkat edin. Bu kod örneğinde bir çift var. Ayrıca, en iyi uygulamalar, saveEvent: span: error öğesinden sonra 'err' değerini kontrol etmenizi ve işleri buna göre işlemenizi gerektirir.
David Carney

Yineleme etkinliğinin nasıl ekleneceğini biliyor musunuz? her pazartesi için bir etkinlik gibi mi?
Jay Vachhani

5
Yinelenen etkinliği programlı olarak ekleyin: Bunu developer.apple.com/library/ios/#documentation/EventKit/… adresine bakın . Başka bir seçenek, etkinlik eklemek / düzenlemek için varsayılan çerçeve tarafından sağlanan görünüm denetleyicilerini kullanmaktır (Bir Bakışta Takvim uygulaması bit.ly/cJq4Bh gibi ). Bu seçenek için bkz. Developer.apple.com/library/ios/#documentation/EventKitUI/…
DenTheMan

XCode 4'te çerçeve eklemek için şu SO sorusuna bakın: stackoverflow.com/questions/3352664/…
Nate

1
4.0? 6'da uçmayacağım, yukarıdaki cevaba bakınız
Boris Gafurov

13

Evet, bunun için hala API yok (2.1). Ancak WWDC'de bir çok insan zaten işlevsellikle ilgileniyordu (kendim dahil) ve öneri aşağıdaki siteye gitmek ve bunun için bir özellik isteği oluşturmaktı. Eğer yeterince ilgi varsa, ICal.framework'u kamu SDK'sına taşıyabilirler.

https://developer.apple.com/bugreporter/


5
Cevabı güncel değil, bunu kaldırmayı düşünün
Jasper

12

İPhone OS 4.0'da takvim erişimi ekleniyor :

Takvim Erişimi
Uygulamaları artık Etkinlik Seti ile doğrudan Takvim uygulamasında etkinlik oluşturabilir ve düzenleyebilir.
Yinelenen etkinlikler oluşturun, başlangıç ​​ve bitiş saatlerini ayarlayın ve bunları cihazdaki herhangi bir takvime atayın.


1
bağlantınız kesildi.
Adil Soomro

5

Etkinliği Tristan'ın belirttiği Etkinlik API'sını kullanarak ekleyebilir ve iOS takviminde görünen bir Google Takvim etkinliği de ekleyebilirsiniz.

kullanarak Google'ın API Objective-C Müşteri

  - (void)addAnEvent {
  // Make a new event, and show it to the user to edit
  GTLCalendarEvent *newEvent = [GTLCalendarEvent object];
  newEvent.summary = @"Sample Added Event";
  newEvent.descriptionProperty = @"Description of sample added event";

  // We'll set the start time to now, and the end time to an hour from now,
  // with a reminder 10 minutes before
  NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60];
  GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date]
                                                    timeZone:[NSTimeZone systemTimeZone]];
  GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow
                                                  timeZone:[NSTimeZone systemTimeZone]];

  newEvent.start = [GTLCalendarEventDateTime object];
  newEvent.start.dateTime = startDateTime;

  newEvent.end = [GTLCalendarEventDateTime object];
  newEvent.end.dateTime = endDateTime;

  GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object];
  reminder.minutes = [NSNumber numberWithInteger:10];
  reminder.method = @"email";

  newEvent.reminders = [GTLCalendarEventReminders object];
  newEvent.reminders.overrides = [NSArray arrayWithObject:reminder];
  newEvent.reminders.useDefault = [NSNumber numberWithBool:NO];

  // Display the event edit dialog
  EditEventWindowController *controller = [[[EditEventWindowController alloc] init] autorelease];
  [controller runModalForWindow:[self window]
                          event:newEvent
              completionHandler:^(NSInteger returnCode, GTLCalendarEvent *event) {
                // Callback
                if (returnCode == NSOKButton) {
                  [self addEvent:event];
                }
              }];
}

5

Swift 4.0 uygulaması:

tarafından sayfanın üst kısmındaki içe aktarmayı kullan import EventKit

sonra

@IBAction func addtoCalendarClicked(sender: AnyObject) {

    let eventStore = EKEventStore()

    eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in

        if (granted) && (error == nil) {
            print("granted \(granted)")
            print("error \(error)")

            let event = EKEvent(eventStore: eventStore)

            event.title = "Event Title"
            event.startDate = Date()
            event.endDate = Date()
            event.notes = "Event Details Here"
            event.calendar = eventStore.defaultCalendarForNewEvents

            var event_id = ""
            do {
                try eventStore.save(event, span: .thisEvent)
                event_id = event.eventIdentifier
            }
            catch let error as NSError {
                print("json error: \(error.localizedDescription)")
            }

            if(event_id != ""){
                print("event added !")
            }
        }
    })
}

u aynı cevap ile ilgili Google takvim ile bana yardımcı olabilir @Dashrath
Dilip Tiwari

4

Dashrath yanıtı için swift 4 güncellemesi

import UIKit
import EventKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let eventStore = EKEventStore()

        eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in

            if (granted) && (error == nil) {


                let event = EKEvent(eventStore: eventStore)

                event.title = "My Event"
                event.startDate = Date(timeIntervalSinceNow: TimeInterval())
                event.endDate = Date(timeIntervalSinceNow: TimeInterval())
                event.notes = "Yeah!!!"
                event.calendar = eventStore.defaultCalendarForNewEvents

                var event_id = ""
                do{
                    try eventStore.save(event, span: .thisEvent)
                    event_id = event.eventIdentifier
                }
                catch let error as NSError {
                    print("json error: \(error.localizedDescription)")
                }

                if(event_id != ""){
                    print("event added !")
                }
            }
        })
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

takvim kullanımı için izin eklemeyi de unutmayın özel ayar için resim


2

Swift-4.2'de çalışma kodu

import UIKit
import EventKit
import EventKitUI

class yourViewController: UIViewController{

    let eventStore = EKEventStore()

    func addEventToCalendar() {

    eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
        DispatchQueue.main.async {
            if (granted) && (error == nil) {
                let event = EKEvent(eventStore: self.eventStore)
                event.title = self.headerDescription
                event.startDate = self.parse(self.requestDetails.value(forKey: "session_time") as? String ?? "")
                event.endDate = self.parse(self.requestDetails.value(forKey: "session_end_time") as? String ?? "")
                let eventController = EKEventEditViewController()
                eventController.event = event
                eventController.eventStore = self.eventStore
                eventController.editViewDelegate = self
                self.present(eventController, animated: true, completion: nil)

            }
        }


       })
    }

}

Şimdi etkinlik ekranını alacağız ve burada ayarlarınızı da değiştirebilirsiniz:

resim açıklamasını buraya girin

Şimdi İptal'i işlemek için temsilci yöntemi ekleyin ve olay ekranının olay düğmesi eylemini ekleyin:

    extension viewController: EKEventEditViewDelegate {

    func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
        controller.dismiss(animated: true, completion: nil)

    }
}

Not: Bilgi plistine NSCalendarsUsageDescription anahtarını eklemeyi unutmayın .


1

EndDate öğesini oluşturulan etkinliğe ayarlamayı unutmayın, zorunludur.

Aksi takdirde bu hatayla başarısız olur (neredeyse sessizce):

"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}"

Benim için tam çalışma kodu:

EKEventStore *store = [EKEventStore new];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    if (!granted) { return; }
    EKEvent *calendarEvent = [EKEvent eventWithEventStore:store];
    calendarEvent.title = [NSString stringWithFormat:@"CEmprendedor: %@", _event.name];
    calendarEvent.startDate = _event.date;
    // 5 hours of duration, we must add the duration of the event to the API
    NSDate *endDate = [_event.date dateByAddingTimeInterval:60*60*5];
    calendarEvent.endDate = endDate;
    calendarEvent.calendar = [store defaultCalendarForNewEvents];
    NSError *err = nil;
    [store saveEvent:calendarEvent span:EKSpanThisEvent commit:YES error:&err];
    self.savedEventId = calendarEvent.eventIdentifier;  //saving the calendar event id to possibly deleted them
}];

1
Ayrıca bitiş tarihinin başlangıç ​​tarihine eşit veya daha büyük olması gerektiğini unutmayın. Aksi takdirde, başka bir hata alırsınız.
karamsar

0

Google fikri hoş bir fikir, ancak sorunları var.

Bir Google takvim etkinliği ekranını başarıyla açabilirim - ancak yalnızca ana masaüstü sürümünde ve iPhone Safari'de düzgün görüntülenmiyor. Safari'de düzgün bir şekilde görüntülenen Google mobil takvimi, etkinlik eklemek için API ile çalışmıyor gibi görünüyor.

Şu an için bundan iyi bir yol göremiyorum.


0

Basit .... tapku kütüphane kullanın .... bu kelime google ve kullanabilirsiniz ... açık kaynak ... keyfini çıkarın ..... bu kodları ile hata ayıklama gerek yok ....



Tapku Kütüphane takvimi takvim uygulaması etkinlikleri ile senkronize edebilir
coder1010

Bildiğim tek şey Tapku kütüphanesinin Veri kaynağı adı verilen bir seçeneği olan bir takvim bileşeni kontrolü olmasıdır. Yani bu kadar kaynak nereden yazmak için onun kadar mantık ... Mutlu Kodlama :)
Rajesh_Bangalore
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.