Question

Après iOS6 Eventkit et les nouveaux paramètres de confidentialité, j'utilise le code suivant - qui fonctionne parfaitement correctement sur les périphériques iOS6.

Néanmoins, je voudrais que le même code fonctionne également pour les périphériques avec iOS 5.x et je souhaite ne pas écrire un "Même code" deux fois - semble faux.

Quelqu'un peut-il aider dans une solution élégante ?

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

// some code 


}];

Était-ce utile?

La solution

J'utilise ceci:

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();
}

Je pense que cela devrait réduire la duplication de code.

Autres conseils

Si vous affichez l'événement dans un modalviewController avec une ekeveneDitViewController, iOS vous montre automatiquement une vue distant quoi faire si la permission est refusée.Donc, je fais cela:

dans la vue ViewDidLoad:

eventStore = [[EKEventStore alloc] init];

Dans la méthode utilisée pour ajouter l'événement:

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

J'ai un fichier eveneutil.m avec

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

et dans le contrôleur d'affichage que je souhaite accéder au calendrier, j'importe le fichier eveneutil.h et appelez cette fonction:

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

DisplayMofinyCalendarAlerertView est la fonction que je veux appeler si l'autorisation de calendrier est donnée (IOS6 ou IOS <6).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top