2013-05-22 18 views
6

Mit dem "Social" -Framework gibt es bei der Präsentation des modalen UIActivityViewControllers, der alle üblichen Social-Media-Icons anzeigt, eine Möglichkeit, genau herauszufinden, auf welches Symbol der Benutzer geklickt hat. Das heißt, wenn sie Twitter, Facebook, Mail, Message usw. gewählt haben?Herausfinden, welches Symbol in UIActivityViewController angeklickt wurde

Ich habe erwartet, möglicherweise einige Delegate-Methoden für diese Klasse in den Docs zu sehen, aber ich sehe nichts.

Hat jemand irgendwelche Ideen?

Antwort

17

Die UIActivityViewController hat die completionHandler Eigenschaft. Implementieren Sie diesen Handler, um benachrichtigt zu werden.

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

Ja, aber das wird ausgelöst, nachdem der Beitrag abgeschlossen ist - was zu meinen Zwecken zu spät ist. Was ich mache, besteht darin, den Tweet (oder Facebook-Post, E-Mail-Nachricht usw.), den der Benutzer mit etwas Text versendet, vorab zu füllen. Abgesehen davon, dass der Text für Tweets, E-Mails usw. unterschiedlich sein wird. Ich dachte also, sobald ich auf das Symbol klicke, kann ich den Text programmatisch ändern. Irgendwelche Ideen, wie man das macht? – sirab333

+0

Sie sollten Ihren Wunsch in Ihrer ursprünglichen Frage deutlich gemacht haben. Sie hätten viel bessere Ergebnisse bekommen. Siehe http://stackoverflow.com/questions/13551042/different-data-for-sharing-providers-in-uactivityviewcontroller – rmaddy

+0

Vielen Dank für den Link - Ich werde es überprüfen! – sirab333

2

Die unten Schnipsel arbeitete in meinem Fall:

[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

Diese Methode ist Completion-Methode. aber ich möchte, wenn ich auf Icon wie FB oder whatsapp klicke, als ich wnat, um Klickereignis zu erhalten. also wie kann ich das tun? –

3

completionHandler veraltet. Verwenden Sie completionWithItemsHandler.

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

auf diese SO Basierend beantworten: https://stackoverflow.com/a/34581940/2177085

Dazu gehören auch Benutzer über WhatsApp oder Google Mail geteilt wird zu überprüfen. Sie können activityType drucken, um andere Typen hinzuzufügen.

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

Die UIActivityViewControllerCompletionWithItemsHandler in Swift typealias 3 geändert

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

Sie die completionWithItemsHandler wie diese verwenden können.

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