找出在 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 中单击了哪个图标的主要内容,如果未能解决你的问题,请参考以下文章

有一堆数,怎么在这堆数种找出几个数使他们的和为N

利用分治策略,在n个不同元素中找出第k个最小元素。

请高手帮我找出这两组数据的对应关系,谢谢!!

如何在iphone中找出当前年份是不是闰年[重复]

找出在 UIActivityViewController 中单击了哪个图标

如何在elasticsearch中找出索引创建日期