找出在 UIActivityViewController 中单击了哪个图标
Posted
技术标签:
【中文标题】找出在 UIActivityViewController 中单击了哪个图标【英文标题】:Figuring out which icon was clicked on in UIActivityViewController 【发布时间】:2013-05-22 00:53:36 【问题描述】:使用“社交”框架,当呈现显示所有常用社交媒体图标的模态 UIActivityViewController 时,有没有办法准确找出用户点击了哪个图标?意思是,如果他们选择 Twitter、Facebook、邮件、消息等?
我希望可能会在文档中看到此类的一些委托方法,但我什么也没看到。
有人有什么想法吗?
【问题讨论】:
【参考方案1】:UIActivityViewController
具有 completionHandler
属性。实现此处理程序以得到通知。
UIActivityViewController *avc = ...;
avc.completionHandler = ^(NSString *activityType, BOOL completed)
if (completed)
NSLog(@"The selected activity was %@", activityType);
;
【讨论】:
是的,但是在帖子完成后触发 - 这对我的目的来说太晚了。我正在做的是预先填充用户正在发送的带有一些文本的推文(或 Facebook 帖子、电子邮件消息等)。除了推文、电子邮件等的文本会有所不同。所以我认为只要用户点击图标,我就可以通过编程方式更改文本。关于如何做到这一点的任何想法? 您应该在最初的问题中明确表达您的愿望。你会得到更好的结果。见***.com/questions/13551042/… 感谢您的链接 - 我会检查一下! @sirab333 您可能应该为每种类型设置不同的按钮 - 会让您的生活更轻松。 @rmaddy 如何向 facebook 和 twitter 添加不同的文本?有什么想法吗?【参考方案2】:斯威夫特 3
Swift 3 中的类型别名 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
【讨论】:
【参考方案3】:completionHandler
已弃用。使用completionWithItemsHandler
。
activityController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError)
NSLog(@"completionWithItemsHandler, activityType: %@, completed: %d, returnedItems: %@, activityError: %@", activityType, completed, returnedItems, activityError);
;
【讨论】:
【参考方案4】:基于这个 SO 答案:https://***.com/a/34581940/2177085
这还包括检查用户是否通过 WhatsApp 或 Gmail 共享。你可以打印activityType来添加其他类型。
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)")
【讨论】:
【参考方案5】:以下 sn-p 在我的情况下有效:
[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.
];
【讨论】:
这个方法是完成方法。但是我想在单击 FB 或 whatsapp 之类的图标时获得,而不是获得单击事件。那我该怎么做呢?以上是关于找出在 UIActivityViewController 中单击了哪个图标的主要内容,如果未能解决你的问题,请参考以下文章