Domanda

Seguendo iOS6 EventKit e le nuove impostazioni sulla privacy che sto usando il seguente codice - che funziona perfettamente bene sui dispositivi iOS6.

Eppure, vorrei che lo stesso codice funzioni anche per i dispositivi con iOS 5.x e desidero non scrivere lo "stesso codice" due volte - sembra sbagliato.

Qualcuno può aiutare in una soluzione elegante> forte ?

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

// some code 


}];
.

È stato utile?

Soluzione

Sto usando questo:

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

Penso che dovrebbe ridurre la duplicazione del codice.

Altri suggerimenti

Se si visualizza l'evento in un ModalViewController con un ekeventeditviewcontroller, iOS ti mostra automaticamente una vista che dice cosa fare se il permesso viene negato.Quindi, lo faccio:

in viewdidload:

eventStore = [[EKEventStore alloc] init];
.

Nel metodo utilizzato per aggiungere l'evento:

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

Ho un file eventutil.m con

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

E nel controller di visualizzazione che voglio accedere al calendario importato il file Eventutil.h e chiamare questa funzione:

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

DisplayModifyCalendAraLertView è la funzione che voglio chiamare se viene fornita l'autorizzazione del calendario (iOS6 o iOS <6).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top