15

EKCalendar を作成し、すべてが正常に見えるという問題がありますが、カレンダーを一覧表示すると表示されません。カレンダー アプリでカレンダー リストも確認しますが、存在しません。何かご意見は?

カレンダーを作成するためのボタン コードは次のとおりです。

- (IBAction)one:(id)sender {
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
}
NSLog(@"cal id = %@", calendar.calendarIdentifier);
}

カレンダーを一覧表示するためのボタン コードを次に示しますが、新しいカレンダーは決して含まれません。

- (IBAction)two:(id)sender {

NSArray *calendars = [eventStore calendarsForEntityType:EKEntityTypeEvent];

for (EKCalendar* cal in calendars){
    NSLog(@"%@",cal.title);
}

}

前もって感謝します!

4

7 に答える 7

36

解決策を見つけました。問題は、iCloud カレンダーをオンにすると、ローカルで作成されたカレンダー アプリが非表示になることです。この問題を回避するには、新しいカレンダーを iCloud ソースに追加します。

    for (EKSource *source in self.eventStore.sources)
    {
        if (source.sourceType == EKSourceTypeCalDAV && 
           [source.title isEqualToString:@"iCloud"]) //Couldn't find better way, if there is, then tell me too. :)
        {
            localSource = source;
            break;
        }
    }

    if (localSource == nil)
    {
        for (EKSource *source in self.eventStore.sources)
        {
            if (source.sourceType == EKSourceTypeLocal)
            {
                localSource = source;
                break;
            }
        }
    }
于 2013-04-12T20:45:49.073 に答える
4

ユーザーがストアへのアクセス許可を与えていることを確認するために、最初に許可設定を確認してみましたか?

EKEventStoreドキュメントの場合:

+ (EKAuthorizationStatus)authorizationStatusForEntityType:(EKEntityType)entityType

- (void)requestAccessToEntityType:(EKEntityType)entityType completion:(EKEventStoreRequestAccessCompletionHandler)completion

重要: アプリが以前にアクセスを要求したことがない場合は、イベントまたはリマインダーを取得または作成する前に、それらへのアクセスを要求する必要があります。このメソッドを使用してユーザーにアクセスを求める前にデータを要求した場合、ユーザーがアクセスを許可した後にデータの受信を開始するには、reset メソッドを使用してイベント ストアをリセットする必要があります。

于 2013-03-29T16:30:15.963 に答える
0

私はこれと同じ問題を抱えていました。私はシックスセントが提案したとおりに実行し、アプリに許可を求めさせました。これで一部は解決しましたが、カレンダーはまだ表示されず、NSLogs に従って作成されていました。私の電話には Exchange カレンダー (iCloud はありませんでした) があり、オフにする必要がありました。それが削除されると、ローカルカレンダーとして表示されました。戻って Exchange を再度追加すると、両方を保持するかどうか尋ねられ、両方のカレンダーが表示されるようになりました。以下は私のコードです。

#import "ViewController.h"
#import <EventKit/EventKit.h>
#import <EventKitUI/EventKitUI.h>

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];  

EKEventStore *store = [[EKEventStore alloc] init];
EKSource *localSource = nil;
for (EKSource *source in store.sources)
{
    if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"])
    {
        localSource = source;
        break;
    }
}
if (localSource == nil)
{        
    for (EKSource *source in store.sources) {
        if (source.sourceType == EKSourceTypeLocal)
        {
            localSource = source;
            break;
        }
    }
}

EKEventStore *es = [[EKEventStore alloc] init];
[es requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    /* This code will run when uses has made his/her choice */

    if (error)
    {
        // display error message here
    }
    else if (!granted)
    {
        // display access denied error message here
    }
    else
    {
        // access granted          
    }


}];

//NSString *identifier; //Use to create for the first time and store somewhere
NSString *identifier = @"704A1304-5213-4AB3-9C7B-F6B59E3454BB"; //Stored version

//Create the calendar
EKCalendar *cal;
if (identifier == nil)
{
    cal = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:store];

    cal.title = @"Demo1 Calendar";
    cal.source = localSource;
    [store saveCalendar:cal commit:YES error:nil];
    NSLog(@"cal id = %@", cal.calendarIdentifier);

} else {
    //Calendar already exists!
    cal = [store calendarWithIdentifier:identifier];
    NSLog(@"cal id = %@", cal.calendarIdentifier);
}

//calendar properties
NSLog(@"%@", cal);

//Add Event to Calendar
NSLog(@"Adding event!");
EKEventStore *eventStore = [[EKEventStore alloc] init];

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

NSDate *startDate = [NSDate date];
event.calendar = cal;
event.startDate = startDate;
event.endDate = [startDate dateByAddingTimeInterval:3600];

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: %@.", error);
}

}
于 2013-07-05T20:43:24.463 に答える