确定在UIActivityViewController中点击了哪个图标

使用“社交”框架,当呈现显示所有常见的社交媒体图标的模态UIActivityViewController时,是否有一种方法可以确切地找出用户点击的图标? 意思是说,如果他们select了Twitter,Facebook,Mail,Message等?

我期待在文档中可能会看到这个类的一些委托方法,但是我什么都看不到。

有人有什么想法?

UIActivityViewController具有completionHandler属性。 实现这个处理程序来通知。

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

completionHandler已弃用。 使用completionWithItemsHandler

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

下面的代码片段在我的情况下工作:

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

基于这个SO回答: https : //stackoverflow.com/a/34581940/2177085

这也包括检查用户是通过WhatsApp或Gmail共享的。 您可以打印activityType来添加其他types。

 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)") } } 

Swift 3

Swift 3中的typealias UIActivityViewControllerCompletionWithItemsHandler更改为

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

你可以像这样使用completionWithItemsHandler。

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