【问题标题】:Figuring out which icon was clicked on in UIActivityViewController找出在 UIActivityViewController 中单击了哪个图标
【发布时间】:2013-05-22 00:53:36
【问题描述】:

使用“社交”框架,当呈现显示所有常用社交媒体图标的模态 UIActivityViewController 时,有没有办法准确找出用户点击了哪个图标?意思是,如果他们选择 Twitter、Facebook、邮件、消息等?

我希望可能会在文档中看到此类的一些委托方法,但我什么也没看到。

有人有什么想法吗?

【问题讨论】:

    标签: ios objective-c uiactivityviewcontroller


    【解决方案1】:

    UIActivityViewController 具有 completionHandler 属性。实现此处理程序以得到通知。

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

    【讨论】:

    • 是的,但是在帖子完成后触发 - 这对我的目的来说太晚了。我正在做的是预先填充用户正在发送的带有一些文本的推文(或 Facebook 帖子、电子邮件消息等)。除了推文、电子邮件等的文本会有所不同。所以我认为只要用户点击图标,我就可以通过编程方式更改文本。关于如何做到这一点的任何想法?
    • 您应该在最初的问题中明确表达您的愿望。你会得到更好的结果。见stackoverflow.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://stackoverflow.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 之类的图标时获得,而不是获得单击事件。那我该怎么做呢?
          猜你喜欢
          • 2014-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多