เพิ่มเหตุการณ์ที่กำหนดเองโดยทางโปรแกรมในปฏิทิน iPhone


คำตอบ:


166

จากเอกสารของ Appleสิ่งนี้เปลี่ยนไปเล็กน้อยเมื่อเทียบกับ iOS 6.0

1) คุณควรร้องขอการเข้าถึงปฏิทินของผู้ใช้ผ่านทาง "requestAccessToEntityType: complete:" และดำเนินการจัดการเหตุการณ์ภายในบล็อก

2) คุณต้องกระทำกิจกรรมของคุณตอนนี้หรือส่ง "มอบหมาย" พารามิเตอร์เพื่อบันทึก / ลบการโทรของคุณ

ทุกสิ่งทุกอย่างยังคงเหมือนเดิม...

เพิ่มกรอบงาน EventKit และ#import <EventKit/EventKit.h>รหัสของคุณ

ในตัวอย่างของฉันฉันมีคุณสมบัติอินสแตนซ์ NSString * saveEventId

ในการเพิ่มกิจกรรม:

    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
    }];

ลบกิจกรรม:

    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];
        }
    }];

สิ่งนี้จะเพิ่มกิจกรรมในปฏิทินเริ่มต้นของคุณหากคุณมีปฏิทินหลายปฏิทินคุณจะพบว่าเป็นปฏิทินใด

รุ่นที่รวดเร็ว

คุณต้องนำเข้ากรอบงาน EventKit

import EventKit

เพิ่มกิจกรรม

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
    }
}

ลบกิจกรรม

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
ไม่ทำงานสำหรับฉันทุกอย่างผิดพลาดโดยไม่มีข้อผิดพลาด แต่ไม่มีเหตุการณ์ในปฏิทิน
Boris Gafurov

ทุกอย่างถูกเก็บไว้ในวัตถุ ekevent แต่ไม่ได้เก็บไว้ในปฏิทิน hlp me

1
@William T: ฉันสามารถแสดงหน้าจอเพิ่มกิจกรรมของแอปปฏิทิน (โดยใช้แบบแผน URL) และส่งผ่านข้อมูลของเหตุการณ์เพื่อที่ว่าเมื่อหน้าจอเพิ่มเหตุการณ์ปรากฏขึ้นจะมีข้อมูลที่กรอกไว้ล่วงหน้า ผู้ใช้เพียงแค่กดปุ่มเพิ่มเหตุการณ์ ในตัวอย่างเหตุการณ์ของคุณเพิ่มโดยไม่มีการบ่งชี้ผู้ใช้
Ans

1
หากดูเหมือนว่าจะใช้งานได้ แต่ยังไม่มีปฏิทินปรากฏขึ้นให้ตรวจสอบเพื่อดูว่ามีปัญหาปฏิทินบนคลาวด์ VS ในเครื่องหรือไม่ หากคุณมีการผสมผสานระหว่างคลาวด์และปฏิทินในพื้นที่ปฏิทินบนคลาวด์สามารถบังคับให้ปฏิทินในพื้นที่ซ่อนเร้นได้
zonabi

2
@ReddyBasha เมื่อคุณเพิ่มกิจกรรมคุณต้องบันทึก eventIdentifier และเก็บไว้ใช้ในอนาคต คุณควรใช้รหัสเหตุการณ์นั้นเมื่อคุณไปลบ
William T.

154

คุณสามารถทำได้โดยใช้เฟรมเวิร์กชุดกิจกรรมใน OS 4.0

คลิกขวาที่กลุ่ม FrameWorks ใน Groups and Files Navigator ทางด้านซ้ายของหน้าต่าง เลือก 'เพิ่ม' จากนั้น 'เฟรมเวิร์กที่มีอยู่' จากนั้นเลือก 'EventKit.Framework'

จากนั้นคุณควรจะสามารถเพิ่มกิจกรรมด้วยรหัสดังนี้:

#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
ขอขอบคุณที่โพสต์สิ่งนี้ เพียงเตือนความทรงจำให้กับทุกคนที่อ่านนี้: ระวังการรั่วไหลของหน่วยความจำ มีคู่ในตัวอย่างโค้ดนี้ นอกจากนี้แนวปฏิบัติที่ดีที่สุดจะบอกให้คุณตรวจสอบค่าของ 'err' หลังจาก saveEvent: span: error และจัดการสิ่งต่าง ๆ ตามลำดับ
David Carney

คุณรู้วิธีเพิ่มเหตุการณ์ที่เกิดซ้ำหรือไม่? เหมือนกิจกรรมสำหรับทุกวันจันทร์หรือไม่?
Jay Vachhani

5
เพิ่มเหตุการณ์เกิดขึ้นอีกโปรแกรม: ตรวจสอบนี้ออกdeveloper.apple.com/library/ios/#documentation/EventKit/... อีกตัวเลือกหนึ่งคือการใช้ตัวควบคุมมุมมองที่มากับเฟรมเวิร์กที่เป็นค่าเริ่มต้นสำหรับการเพิ่ม / แก้ไขเหตุการณ์ (เช่นแอปปฏิทิน At-A-Glance bit.ly/cJq4Bh ) สำหรับตัวเลือกนี้ดูdeveloper.apple.com/library/ios/#documentation/EventKitUI/
......

ในการเพิ่มเฟรมเวิร์กใน XCode 4 ดูคำถาม SO นี้: stackoverflow.com/questions/3352664/…
Nate

1
4.0? ไม่ gonna บินใน 6 ดูด้านบนคำตอบ
บอริส Gafurov

13

ใช่ยังไม่มี API สำหรับสิ่งนี้ (2.1) แต่ดูเหมือนว่าที่ WWDC ผู้คนจำนวนมากสนใจฟังก์ชั่น (รวมถึงตัวฉันเอง) อยู่แล้วและคำแนะนำก็คือไปที่ไซต์ด้านล่างและสร้างคำขอคุณลักษณะสำหรับสิ่งนี้ หากมีความสนใจเพียงพอพวกเขาอาจสิ้นสุดการย้าย ICal.framework ไปยัง SDK สาธารณะ

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


5
คำตอบล้าสมัยให้ลองลบสิ่งนี้
Jasper

12

กำลังเพิ่มการเข้าถึงปฏิทินใน iPhone OS 4.0 :


แอพAccess Calendarสามารถสร้างและแก้ไขเหตุการณ์ได้โดยตรงในแอพ Calendar ด้วย Event Kit
สร้างกิจกรรมที่เกิดซ้ำตั้งค่าเวลาเริ่มต้นและสิ้นสุดและกำหนดให้กับปฏิทินใด ๆ บนอุปกรณ์


1
ลิงค์ของคุณเสียตอนนี้
Adil Soomro

5

คุณสามารถเพิ่มกิจกรรมโดยใช้ Event API เช่น Tristan ที่ระบุไว้และคุณยังสามารถเพิ่มกิจกรรม Google ปฏิทินที่แสดงในปฏิทิน iOS

ใช้ไคลเอนต์ API Objective-C ของ Google

  - (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:

ใช้การนำเข้าที่ด้านบนของหน้าโดย import EventKit

แล้วก็

@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 !")
            }
        }
    })
}

คุณสามารถช่วยฉันด้วย google calendar เกี่ยวกับคำตอบเดียวกัน @Dashrath
Dilip Tiwari

4

อัปเดตสำหรับ swift 4 สำหรับคำตอบ Dashrath

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.
    }


}

อย่าลืมเพิ่มสิทธิ์สำหรับการใช้ปฏิทิน ภาพสำหรับการตั้งค่าส่วนตัว


2

รหัสการทำงานใน Swift-4.2

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)

            }
        }


       })
    }

}

ตอนนี้เราจะได้รับหน้าจอกิจกรรมและที่นี่คุณสามารถแก้ไขการตั้งค่าของคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้เพิ่มวิธีการมอบหมายเพื่อจัดการยกเลิกและเพิ่มการกระทำปุ่มเหตุการณ์ของหน้าจอกิจกรรม:

    extension viewController: EKEventEditViewDelegate {

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

    }
}

หมายเหตุ:อย่าลืมเพิ่มคีย์NSCalendarsUsageDescriptionลงในตัวจัดการข้อมูล


1

จำไว้ว่าให้ตั้งค่า endDate เป็นเหตุการณ์ที่สร้างขึ้น

มิฉะนั้นจะเกิดข้อผิดพลาด (เกือบจะเงียบ) ด้วยข้อผิดพลาดนี้:

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

รหัสการทำงานที่สมบูรณ์สำหรับฉันคือ:

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
และโปรดจำไว้ว่าวันที่สิ้นสุดจะต้องเท่ากันหรือใหญ่กว่าวันที่เริ่มต้น มิฉะนั้นคุณจะได้รับข้อผิดพลาดอื่น
เจ้าอารมณ์

0

แนวคิดของ Google เป็นแนวคิดที่ดี แต่มีปัญหา

ฉันสามารถเปิดหน้าจอกิจกรรม Google ปฏิทินได้สำเร็จ - เฉพาะในเวอร์ชันเดสก์ท็อปหลักเท่านั้นและไม่สามารถแสดงได้อย่างถูกต้องบน iPhone Safari ปฏิทินมือถือของ Google ซึ่งแสดงอย่างถูกต้องบน Safari ดูเหมือนจะไม่ทำงานกับ API เพื่อเพิ่มกิจกรรม

ในขณะนี้ฉันไม่สามารถเห็นวิธีที่ดีจากหนึ่งในนี้


0

ง่าย ๆ .... ใช้ไลบรารี tapku .... คุณสามารถ google คำนั้นและใช้มัน ... โอเพ่นซอร์ส ... เพลิดเพลินไปกับ ..... ไม่จำเป็นต้องมีการดักฟังรหัสเหล่านั้น ....



ปฏิทิน Tapku Library สามารถซิงโครไนซ์กับกิจกรรมแอปปฏิทินได้
coder1010

สิ่งที่ฉันรู้คือห้องสมุด Tapku เป็นตัวควบคุมส่วนประกอบปฏิทินซึ่งมีตัวเลือกที่เรียกว่าแหล่งข้อมูล ดังนั้นตรรกะของไม่เกิน ur การเขียนที่แหล่งที่มาที่คุณกำลังเรียกจาก ... มีความสุข Coding :)
Rajesh_Bangalore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.