2013-05-22 10 views
6

Utilizzando il framework "Social", quando si presenta il modale UIActivityViewController che visualizza tutte le solite icone social-media, c'è un modo per scoprire esattamente quale icona l'utente ha fatto clic? Significa, se hanno scelto Twitter, Facebook, Mail, Messaggio, ecc.?Capire quale icona è stata cliccata su UIActivityViewController

Mi aspettavo di vedere alcuni metodi delegati per questa classe nei documenti ma non vedo nulla.

Qualcuno ha qualche idea?

risposta

17

Il UIActivityViewController ha la proprietà completionHandler. Implementare questo gestore per essere notificato.

UIActivityViewController *avc = ...; 
avc.completionHandler = ^(NSString *activityType, BOOL completed) { 
    if (completed) { 
     NSLog(@"The selected activity was %@", activityType); 
    } 
}; 
+1

Sì, ma viene attivato DOPO che il post è completo, che è troppo tardi per i miei scopi. Quello che sto facendo è precompilare il Tweet (o il post di Facebook, il messaggio di posta elettronica, ecc.) Che l'utente sta inviando con del testo. Tranne che quella parte di testo sarà diversa per tweet, e-mail, ecc. Così ho pensato che non appena l'utente fa clic sull'icona, posso quindi cambiare il testo a livello di programmazione. Qualche idea su come farlo? – sirab333

+0

Avresti dovuto chiarire il tuo desiderio nella tua domanda originale. Avresti ottenuto risultati molto migliori. Vedi http://stackoverflow.com/questions/13551042/different-data-for-sharing-providers-in-uiactivityviewcontroller – rmaddy

+0

Grazie per il link - Verificherò! – sirab333

2

Il frammento di seguito ha lavorato nel mio caso:

[activityController setCompletionHandler:^(NSString *act, BOOL done) 
{ 

    NSLog(@"act type %@",act); 
    NSString *ServiceMsg = nil; 
    if ([act isEqualToString:UIActivityTypeMail]) 
    ServiceMsg = @"Mail sent"; 

    if ([act isEqualToString:UIActivityTypePostToTwitter]) 
    ServiceMsg = @"Post on twitter, ok!"; 

    if ([act isEqualToString:UIActivityTypePostToFacebook]) 
    ServiceMsg = @"Post on facebook, ok!"; 

    if (done) 
    { 
     UIAlertView *Alert = [[UIAlertView alloc] initWithTitle:ServiceMsg message:@"" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil]; 
     [Alert show]; 
     [Alert release]; 
    } 
    else 
    { 
     // didn't succeed. 
    } 
}]; 
+0

Questo metodo è il metodo di completamento. ma voglio arrivare quando clicco su Icon come FB o whatsapp di quanto non sia necessario per ottenere l'evento click. quindi come posso fare questo? –

3

completionHandler è deprecato. Utilizzare completionWithItemsHandler.

activityController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { 
    NSLog(@"completionWithItemsHandler, activityType: %@, completed: %d, returnedItems: %@, activityError: %@", activityType, completed, returnedItems, activityError); 
}; 
2

sulla base di questo SO rispondere: https://stackoverflow.com/a/34581940/2177085

Questo include anche da controllare è utente condiviso attraverso WhatsApp o Gmail. È possibile stampare activityType per aggiungere altri tipi.

let activityViewController = UIActivityViewController(activityItems: [finalMsg as NSString], applicationActivities: nil) 
self.presentViewController(activityViewController, animated: true, completion: nil) 

activityViewController.completionWithItemsHandler = {(activityType, completed:Bool, returnedItems:[AnyObject]?, error: NSError?) in 

// Return if cancelled 
if (!completed) { 
    print("user clicked cancel") 
    return 
} 

if activityType == UIActivityTypeMail { 
    print("share throgh mail") 
} 
else if activityType == UIActivityTypeMessage { 
    print("share trhought Message IOS") 
} 
else if activityType == UIActivityTypePostToTwitter { 
    print("posted to twitter") 
} 
else if activityType == UIActivityTypePostToFacebook { 
    print("posted to facebook") 
} 
else if activityType == UIActivityTypeCopyToPasteboard { 
    print("copied to clipboard") 
} 
else if activityType! == "net.whatsapp.WhatsApp.ShareExtension" { 
    print("activity type is whatsapp") 
} 
else if activityType! == "com.google.Gmail.ShareExtension" { 
    print("activity type is Gmail") 
} 
else { 
    // You can add this activity type after getting the value from console for other apps. 
    print("activity type is: \(activityType)") 
} 
} 
2

Swift 3

Le typealias UIActivityViewControllerCompletionWithItemsHandler a Swift 3 modificati per

public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, [Any]?, Error?) -> Swift.Void

È possibile utilizzare il completionWithItemsHandler come questo.

activityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems:[Any]?, error: Error?) in 
    //Do whatever you want 
} 
Problemi correlati