9

Sto costruendo un app per leggere articoli per iPad. Ho integrato una funzionalità di condivisione sociale che significa che l'utente può condividere articoli su Facebook e google mail. Sto usando UIActivityViewController per la condivisione.Problema UIActivityViewController iOS 7 e iOS 8?

C'è un elemento pulsante della barra, quando l'utente clicca su quel UIActivityViewController opens.I aggiornati Xcode 6 Quando eseguo sul simulatore funziona benissimo, ma ho eseguito sul dispositivo reale (iPad) con iOS 7, l'app in crash su facendo clic sulla voce del pulsante della barra. questo è il mio codice:

 - (IBAction)ysshareAction:(id)sender 
     { 

     NSURL *linkURL = [NSURL URLWithString:_DetailModal1[4]];//article url 
     NSMutableAttributedString *stringText = [[NSMutableAttributedString alloc] initWithString:_DetailModal1[0]];//_DetailModal1[0] contain article title//// 
     [stringText addAttribute:NSLinkAttributeName value:linkURL range:NSMakeRange(0, stringText.length)]; 
     NSArray * itemsArray = @[[NSString stringWithFormat:@"%@",_DetailModal1[0]], [NSURL URLWithString:_DetailModal1[4]]]; 
     NSArray * applicationActivities = nil; 
     UIActivityViewController * AVC = [[UIActivityViewController alloc] initWithActivityItems:itemsArray applicationActivities:applicationActivities]; 
     AVC.popoverPresentationController.sourceView = _webView; 
     [self presentViewController:AVC animated:YES completion:nil]; 
     [AVC setCompletionHandler:^(NSString *act, BOOL done) 
     { 

     if([act isEqualToString:UIActivityTypeMail]) { 
     ServiceMsg = @"Mail sent!"; 
    } else if([act isEqualToString:UIActivityTypePostToTwitter]) { 
     ServiceMsg = @"Article Shared!"; 
    } else if([act isEqualToString:UIActivityTypePostToFacebook]) { 
     ServiceMsg = @"Article Shared!"; 
    } else if([act isEqualToString:UIActivityTypeMessage]) { 
     ServiceMsg = @"SMS sent!"; 
    } else if([act isEqualToString:UIActivityTypeAddToReadingList]) { 
     ServiceMsg = @"Added to Reading List"; 
    } else if([act isEqualToString:UIActivityTypeCopyToPasteboard]){ 
     ServiceMsg = @"Copied Link"; 
    } 

    if (done) 
    { 
     UIAlertView *Alert = [[UIAlertView alloc] initWithTitle:ServiceMsg message:@"" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil]; 
     [Alert show]; 

      } 
     }]; 

    } 

aiuto è apprezzato!

+0

Si prega di citare i registri di crash nella vostra domanda. – Kampai

risposta

19

Seguendo la linea è la questione

AVC.popoverPresentationController.sourceView = _webView; 

Si dovrà mettere condizioni iOS 8 al fine popoverPresentationController viene introdotto per iOS 8 e versioni successive, quindi non è possibile utilizzarlo con iOS 7

Per il controllo per iOS 8 si può definire una macro come trovato da here

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

e utilizzarlo in modo seguente.

 NSURL *linkURL = [NSURL URLWithString:_DetailModal1[4]];//article url 
    NSMutableAttributedString *stringText = [[NSMutableAttributedString alloc] initWithString:_DetailModal1[0]];//_DetailModal1[0] contain article title//// 
    [stringText addAttribute:NSLinkAttributeName value:linkURL range:NSMakeRange(0, stringText.length)]; 
    NSArray * itemsArray = @[[NSString stringWithFormat:@"%@",_DetailModal1[0]], [NSURL URLWithString:_DetailModal1[4]]]; 
    NSArray * applicationActivities = nil; 
    UIActivityViewController * AVC = [[UIActivityViewController alloc] initWithActivityItems:itemsArray applicationActivities:applicationActivities]; 

    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")){ 

     AVC.popoverPresentationController.sourceView = _webView; 
    } 
    [self presentViewController:AVC animated:YES completion:nil]; 

consultare this per maggiori informazioni su cosa è cambiato per UIActivityViewController in iOS 8

+0

Grazie, potresti dirmi che cos'è isGreaterThaniOS8 qui. Mostra un errore: Uso dell'identificatore non dichiarato 'isGreaterThaniOS8' – Daljeet

+0

Solo un minuto fammi modificare –

+0

Verifica la mia risposta modificata, è una macro utilizzata per verificare se la versione di iOS è maggiore o uguale a 8.0 –

5

Molti potrebbero sostenere che il controllo per l'esistenza della classe è esplicitamente meglio di controllare un numero di versione hard coded. UIPopoverPresentationController può essere sconsigliato ad un certo punto futuro, o ci potrebbe essere un (futuro?) Dispositivo che non supporta la classe, come l'iPhone mai utilizzato per sostenere UIPopoverController o UISplitViewController ..

if ( NSClassFromString(@"UIPopoverPresentationController") ) { 

AVC.popoverPresentationController.sourceView = _webView; 


} 
+1

D'accordo con il controllo dell'esistenza di una classe, tuttavia, a partire da iOS 4.2, il modo consigliato di verificare l'esistenza di una classe è di usare il metodo 'NSObject class'. In questo caso: 'if ([classe UIPopoverPresentationController]) {...}' Il vantaggio è che si ottiene il controllo del tipo di compilatore. – mluisbrown

0

In Swift, è possibile uso '?' controllando invece la versione del sistema operativo. AVC.popoverPresentationController? .sourceView = _webView

Problemi correlati