2012-12-05 2 views
5

Ho un UIActivityViewController che condivide testo e immagine su Facebook/Twitter/Email, ma funziona solo su iOS 6+ .. È possibile prendere la versione iOS in esecuzione sul dispositivo e fare un Dichiarazione IF per evitare arresti anomali in iOS 5? Se iOS6, fai il seguente codice, altrimenti fai qualcos'altro ...?se iOS 6 [fai questo] altro iOS 5 [farlo]? - UIActivityViewController

-(void)shareMenu 
{ 
    NSString *textToShare = @"Text that will be shared"; 
    UIImage *imageToShare = [UIImage imageNamed:@"share_picture.png"]; 
    NSArray *itemsToShare = [[NSArray alloc] initWithObjects:textToShare, imageToShare, nil]; 
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:itemsToShare applicationActivities:nil]; 
    activityVC.excludedActivityTypes = [[NSArray alloc] initWithObjects: UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeMessage, UIActivityTypePostToWeibo, nil]; 
    [self presentViewController:activityVC animated:YES completion:nil]; 
} 
+0

in generale (non questo caso specifico), trovo di solito è meglio usare 'respondsToSelector' per determinare quale versione di una classe iOS ho a che fare, in base a quali metodi esso supporta. Tra le altre cose questo aiuta a documentare la dipendenza specifica. –

risposta

25
if([UIActivityViewController class]) { 
    NSString *textToShare = @"Text that will be shared"; 
    UIImage *imageToShare = [UIImage imageNamed:@"share_picture.png"]; 
    NSArray *itemsToShare = [[NSArray alloc] initWithObjects:textToShare, imageToShare, nil]; 
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:itemsToShare applicationActivities:nil]; 
    activityVC.excludedActivityTypes = [[NSArray alloc] initWithObjects: UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeMessage, UIActivityTypePostToWeibo, nil]; 
    [self presentViewController:activityVC animated:YES completion:nil]; 
} 

O meglio l'uso

if(NSClassFromString (@"UIActivityViewController")) { 

} 

Leggi this

+2

Questa è una soluzione migliore rispetto al test dei numeri di versione di iOS esplicitamente. – vcsjones

+0

Questo funziona al 100% grazie! Ma come posso nascondere ** UIBarButtonItem ** nella mia ** NavigationBar ** quando non è in esecuzione su iOS6? In iOS5 è cliccabile ma non funziona, quindi voglio nasconderlo per favore? Grazie per la tua risposta! – emotality

+0

http://stackoverflow.com/questions/10021748/how-do-i-show-hide-a-uibarbuttonitem – Max

0

Si dovrebbe considerare l'utilizzo di [[UIDevice currentDevice] systemVersion] che restituirà una stringa per il sistema operativo corrente. Puoi facilmente scrivere una macro per vedere se la versione è almeno un numero specificato.

+4

Questa non è una buona idea. È molto meglio verificare l'esistenza della classe desiderata. È molto più pulito e diretto che fare affidamento sui numeri di versione. – rmaddy

+0

Grazie per la tua risposta! :) – emotality

+0

C'è un vantaggio nel testare la versione del sistema: documenta molto chiaramente quando è possibile rimuovere di nuovo il test (cioè quando si rilascia iOS 5). – nschum

4

Ci sono alcuni modi per farlo, ma il più semplice è probabilmente quello di verificare l'esistenza di questa classe, ad es.

if ([UIActivityViewController class]) 
    //iOS 6+ 
else 
    // < iOS 6 
+0

Grazie per la tua risposta! :) – emotality