3

iOS6 eventKit と新しいプライバシー設定に従って、私は次のコードを使用しています - これは iOS6 デバイスで完全に正常に動作します。

それでも、iOS 5.x を搭載したデバイスでも同じコードが機能することを望み、「同じコード」を 2 回書きたくない - 間違っているようだ。

誰でもエレガントなソリューションを支援できますか?

 EKEventStore *eventStore = [[EKEventStore alloc] init];
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {

// some code 


}];
4

3 に答える 3

9

私はこれを使用しています:

void (^addEventBlock)();

addEventBlock = ^
{
    NSLog(@"Hi!");
};

EKEventStore *eventStore = [[UpdateManager sharedUpdateManager] eventStore];

if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
     {
         if (granted)
         {   
             addEventBlock();
         }
         else
         {
             NSLog(@"Not granted");
         }
     }];
}
else
{
    addEventBlock();
}

コードの重複を減らすべきだと思います。

于 2012-09-30T11:00:49.193 に答える
4

EKEventEditViewControllerを使用してモーダルビューコントローラーでイベントを表示すると、iOSは、アクセス許可が拒否された場合の対処方法を示すビューを自動的に表示します。だから、私はこれを行います:

viewDidLoadの場合:

eventStore = [[EKEventStore alloc] init];

イベントの追加に使用されるメソッド:

if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
    __block typeof (self) weakSelf = self; // replace __block with __weak if you are using ARC
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
     {
         if (granted)
         {   
             [weakSelf performSelectorOnMainThread:@selector(addEventToCalendar) withObject:nil waitUntilDone:YES];
         }
         else
         {
             NSLog(@"Not granted");
         }
     }];
}
else
{
    [self addEventToCalendar];
}
于 2012-10-05T12:05:14.353 に答える
0

私は EventUtil.m ファイルを持っています

+(void)proxyForIOS6EventKitToCallFunction:(SEL)function WithViewController:(UIViewController*)viewController {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    if([app.eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
        // For iOS 6
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:viewController.view animated:YES];
        hud.labelText = @"";
        //invoke requestAccessToEntityType...
        [app.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
            //Handle the response here…
            //Note: If you prompt the user, make sure to call the main thread
            if (granted == YES) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [viewController performSelector:function];
                });
            }
        }];
    }
    else {
        [viewController performSelector:function];
    }
    #pragma clang diagnostic pop
}

そして、カレンダーにアクセスしたいView Controllerで EventUtil.h ファイルをインポートし、この関数を呼び出します:

[EventUtil proxyForIOS6EventKitToCallFunction:@selector(displayModifyCalendarAlertView) WithViewController:self];

displayModifyCalendarAlertView は、カレンダーの許可が与えられている場合 (iOS6 または iOS < 6) に呼び出したい関数です。

于 2012-11-01T09:59:47.153 に答える