10

アプリケーションからネイティブの IOS カレンダー (ical) を開き、イベントを追加したいと考えています。特定のイベントのカレンダーを開く方法はありますか?

Open iphone calendar appもプログラムでフォローしていますが、まだ成功していません。

4

3 に答える 3

32

カレンダーとリマインダーのプログラミング ガイドを参照してください。しかし、基本的なプロセスは次のとおりです。

  1. EventKit.Frameworkとをプロジェクトに追加EventKitUI.Frameworkします。(ライブラリまたはフレームワークへのリンクを参照してください。)

  2. ヘッダーをインポートします。

    #import <EventKitUI/EventKitUI.h>
    
  3. イベントを作成する場合は、次を使用します。

    - (IBAction)didPressCreateEventButton:(id)sender
    {
        EKEventStore *store = [[EKEventStore alloc] init];
    
        if([store respondsToSelector:@selector(requestAccessToEntityType:completion:)])
        {
            // iOS 6
            [store requestAccessToEntityType:EKEntityTypeEvent
                                  completion:^(BOOL granted, NSError *error) {
                                      if (granted)
                                      {
                                          dispatch_async(dispatch_get_main_queue(), ^{
                                              [self createEventAndPresentViewController:store];
                                          });
                                      }
                                  }];
        } else
        {
            // iOS 5
            [self createEventAndPresentViewController:store];
        }
    }
    
    - (void)createEventAndPresentViewController:(EKEventStore *)store
    {
        EKEvent *event = [self findOrCreateEvent:store];
    
        EKEventEditViewController *controller = [[EKEventEditViewController alloc] init];
        controller.event = event;
        controller.eventStore = store;
        controller.editViewDelegate = self;
    
        [self presentViewController:controller animated:YES completion:nil];
    }
    
  4. View Controller はEKEventEditViewDelegateプロトコルに準拠する必要があります。

    @interface ViewController () <EKEventEditViewDelegate>
    

    didCompleteWithActionメソッドを実装します。

    - (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action
    {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    
  5. もちろん、イベントは好きなように作成できます。たとえば、これは次の週に適切なタイトルのイベントを検索し、見つからない場合は新しいイベント (4 時間で始まる 1 時間のイベント) を作成します。

    - (EKEvent *)findOrCreateEvent:(EKEventStore *)store
    {
        NSString *title = @"My event title";
    
        // try to find an event
    
        EKEvent *event = [self findEventWithTitle:title inEventStore:store];
    
        // if found, use it
    
        if (event)
            return event;
    
        // if not, let's create new event
    
        event = [EKEvent eventWithEventStore:store];
    
        event.title = title;
        event.notes = @"My event notes";
        event.location = @"My event location";
        event.calendar = [store defaultCalendarForNewEvents];
    
        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSDateComponents *components = [[NSDateComponents alloc] init];
        components.hour = 4;
        event.startDate = [calendar dateByAddingComponents:components
                                                    toDate:[NSDate date]
                                                   options:0];
        components.hour = 1;
        event.endDate = [calendar dateByAddingComponents:components
                                                  toDate:event.startDate
                                                 options:0];
    
        return event;
    }
    
    - (EKEvent *)findEventWithTitle:(NSString *)title inEventStore:(EKEventStore *)store
    {
        // Get the appropriate calendar
        NSCalendar *calendar = [NSCalendar currentCalendar];
    
        // Create the start range date components
        NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
        oneDayAgoComponents.day = -1;
        NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
                                                      toDate:[NSDate date]
                                                     options:0];
    
        // Create the end range date components
        NSDateComponents *oneWeekFromNowComponents = [[NSDateComponents alloc] init];
        oneWeekFromNowComponents.day = 7;
        NSDate *oneWeekFromNow = [calendar dateByAddingComponents:oneWeekFromNowComponents
                                                           toDate:[NSDate date]
                                                          options:0];
    
        // Create the predicate from the event store's instance method
        NSPredicate *predicate = [store predicateForEventsWithStartDate:oneDayAgo
                                                                endDate:oneWeekFromNow
                                                              calendars:nil];
    
        // Fetch all events that match the predicate
        NSArray *events = [store eventsMatchingPredicate:predicate];
    
        for (EKEvent *event in events)
        {
            if ([title isEqualToString:event.title])
            {
                return event;
            }
        }
    
        return nil;
    }
    
于 2013-04-01T12:11:40.807 に答える
10

URL スキームを使用して、ネイティブのカレンダー アプリを開きます。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"calshow://"]];

http://devsupport.layar.com/entries/23687993-How-to-use-Custom-URI-Scheme-Button-in-the-Creator-

于 2013-09-04T12:01:04.040 に答える