2010-10-13 27 views
8

Tôi muốn chèn các sự kiện vào ứng dụng của mình để có thể xem chúng trong Lịch iPhone.app. Nhưng vì tôi không muốn kết hợp các sự kiện của người dùng với các sự kiện từ ứng dụng của mình, tôi muốn tạo EKCalendar như "Sự kiện của MyApp"Bộ sự kiện iPhone: lập trình tạo EKCalendar?

Điều này có khả thi không? Bạn sẽ lọc các sự kiện của mình bằng cách nào?

Cảm ơn!

Trả lời

12

Đó là hoàn toàn có thể tạo ra lịch của riêng bạn - nắm bắt được những gì bạn cần iOS 5:

EKEventStore* eventStore = [[EKEventStore alloc] init]; 
NSString* calendarName = @"My Cal"; 
EKCalendar* calendar; 

// Get the calendar source 
EKSource* localSource; 
for (EKSource* source in eventStore.sources) { 
    if (source.sourceType == EKSourceTypeLocal) 
    { 
     localSource = source; 
     break; 
    } 
} 

if (!localSource) 
    return; 

calendar = [EKCalendar calendarWithEventStore:eventStore]; 
calendar.source = localSource; 
calendar.title = calendarName; 

NSError* error; 
bool success= [eventStore saveCalendar:calendar commit:YES error:&error]; 
if (error != nil) 
{ 
    NSLog(error.description); 
    // TODO: error handling here 
} 
+0

Làm cách nào bạn kiểm tra xem lịch đã tồn tại chưa? Tôi sẽ không muốn tạo ra lịch liên tục một cách tình cờ? – Slee

+0

Khi bạn tạo lịch, có một thuộc tính có tên là calendarIdentifier là một định danh duy nhất. Lưu trữ mã định danh duy nhất đó (và mã định danh của sự kiện quá - đảm bảo rằng không thay đổi) và kiểm tra cửa hàng sự kiện để xem nó có tồn tại hay không trước khi tạo nó. – kurtzmarc

+0

Nhưng đây là bắt: Tôi thấy rằng nếu ứng dụng của tôi tạo lịch địa phương, người dùng không thể xóa nó sau này. Điều đó có vẻ như một lỗi. – matt

2

Bạn (hoặc bất kỳ ai khác) có bất kỳ tiến bộ nào với việc thêm Lịch mới không?

Tôi cũng có tình huống tương tự. Tôi có thể thêm các sự kiện vào lịch mặc định một cách hoàn hảo, nhưng tôi muốn thêm chúng vào lịch mới, vì vậy chúng không ảnh hưởng đến các sự kiện hiện có của người dùng và có thể dễ dàng xóa/ẩn bởi người dùng thay vì xóa tất cả các sự kiện theo cách thủ công.

Bạn không thể đặt thuộc tính cho đối tượng EKCalendar mới. Có vẻ như bạn chỉ có thể chỉ định một tệp exsiting như defaultCalendarForNewEvents cho đối tượng EKCalendar.

Tuy nhiên, tôi biết có thể lập lịch tạo lịch mới, vì tôi đã thấy ứng dụng iPhone thực hiện việc này (mà không cần rời khỏi ứng dụng).

  • Có thể là họ sử dụng giải pháp thay thế bằng cách thực hiện một số thủ thuật với tệp ICS bên ngoài?
  • Có thể bạn có thể thực hiện việc này bằng cách "đăng ký" vào một tệp ICS cục bộ (trên hệ thống tệp của iPhone/ứng dụng) được tạo ra thay vì một URL. Có ai có bất cứ kinh nghiệm với điều này?
+0

Điều này thực sự có thể hoạt động !! Tôi sẽ thử điều này ... – Marsson

+0

bất kỳ tiến bộ nào liên quan đến vấn đề này? – Buju

0

Đây là cách bạn có thể kiểm tra liệu một lịch đã tồn tại với tiêu đề cụ thể. Nếu nó không tồn tại thì bạn có thể tạo nó theo chương trình.

Khai báo một loại Boolean Biến

BOOL doesExist=NO; 
    EKEventStore *eventStore=[[EKEventStore alloc] init]; 

    NSArray *calanders=[eventStore calendarsForEntityType:EKEntityTypeEvent]; 

    //Now Iterate through every calendar in the array and match its title 
    // with the title that you want to create 



for(EKCalendar calendar in calendars) 
    { 
     if([[calendar title] isEqualToString:@"youdesiredname"]) 
      { 
        doesExist=YES; 
      } 

    } 

// vì vậy bây giờ kiểm tra xem biến bool của chúng tôi chứa giá trị YES nó có nghĩa là một cuốn lịch với cùng tên/title đã exists.if không có thì bạn có thể tạo

if(!doesExist) 
    { 
     NSString* calendarName = @"DesiredCalendarName"; 
     EKCalendar* calendar; 


     EKSource* localSource; 
     for (EKSource* source in eventStore.sources) { 
     if (source.sourceType == EKSourceTypeLocal) 
     { 
     localSource = source; 
     break; 
     } 




    if (!localSource) 
     return; 

     calendar = [EKCalendar calendarWithEventStore:eventStore]; 
     calendar.source = localSource; 
     calendar.title = calendarName; 


     EKEvent *event = [EKEvent eventWithEventStore:eventStore]; 
     calendar = [eventStore calendarWithIdentifier:self.calendarIdentifier]; 
     event.calendar = calendar; 

     // Set the start date to the current date/time and the event duration to one hour 
     NSDate *startDate = [NSDate date]; 
     event.startDate = startDate; 
     event.endDate = [startDate dateByAddingTimeInterval:3600]; 

     //And to save the event to the event database: 

     NSError *error = nil; 
    BOOL result = [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error]; 
    if (result) 
    { 
    NSLog(@"Saved event to event store.") 
    } 
    else 
    { 
    NSLog(@"Error saving event: %@.", saveError); 
    } 

     NSError* error; 
     bool success= [eventStore saveCalendar:calendar commit:YES error:&error]; 
     if (error != nil) 
     { 
     NSLog(error.description); 

     } 

    } 
Các vấn đề liên quan