确定在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 }