【问题标题】:Set different activity items for UIActivityViewController Swift为 UIActivityViewController Swift 设置不同的活动项
【发布时间】:2015-05-05 21:39:38
【问题描述】:

我有 UIActivityViewController 有 4 个选项:消息 / 邮件 / TW / FB。 我想为每个选项发送不同的活动!

例如: 在iMessage 表中,我需要输入:StringNSURLUIImage。 在邮件中,我需要在主题字段中放置字符串,然后在正文中放置字符串,UIImageNSURL。 在TW/FB,我想在社交帖子中放置图片,还有一些字符串和NSURL

你知道这在 iOS8 中是否可以使用 Swift 吗?

我搜索了很多代码,没有找到最适合我的。

【问题讨论】:

    标签: ios swift uiactivityviewcontroller


    【解决方案1】:

    您应该利用UIActivityItemSource 协议。 UIActivityViewController 的初始化程序的 activityItems 参数接受数据对象数组或实现 UIActivityItemSource 协议的对象数组。

    例如,考虑如下的项目来源。

    class MyStringItemSource: NSObject, UIActivityItemSource {
        @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
            return ""
        }
    
        @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
            if activityType == UIActivityTypeMessage {
                return "String for message"
            } else if activityType == UIActivityTypeMail {
                return "String for mail"
            } else if activityType == UIActivityTypePostToTwitter {
                return "String for twitter"
            } else if activityType == UIActivityTypePostToFacebook {
                return "String for facebook"
            }
            return nil
        }
    
        func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
            if activityType == UIActivityTypeMessage {
                return "Subject for message"
            } else if activityType == UIActivityTypeMail {
                return "Subject for mail"
            } else if activityType == UIActivityTypePostToTwitter {
                return "Subject for twitter"
            } else if activityType == UIActivityTypePostToFacebook {
                return "Subject for facebook"
            }
            return ""
        }
    
        func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String!, suggestedSize size: CGSize) -> UIImage! {
            if activityType == UIActivityTypeMessage {
                return UIImage(named: "thumbnail-for-message")
            } else if activityType == UIActivityTypeMail {
                return UIImage(named: "thumbnail-for-mail")
            } else if activityType == UIActivityTypePostToTwitter {
                return UIImage(named: "thumbnail-for-twitter")
            } else if activityType == UIActivityTypePostToFacebook {
                return UIImage(named: "thumbnail-for-facebook")
            }
            return UIImage(named: "some-default-thumbnail")
        }
    }
    

    以上item源根据activity类型返回不同的字符串数据对象、主题和缩略图。要使用,只需将其传递给 UIActivityViewController 初始化程序即可。

    UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)
    

    同样,您可以定义一个自定义 MyUrlItemSource 类,该类根据所选活动返回不同的 URL,并将其传递到初始化程序中。

    UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)
    

    所有这些都在UIActivityViewControllerUIActivityItemSource 的官方文档中进行了概述

    【讨论】:

    • @BhaveshNai:这里没有太多的 Swift 魔法。将上述内容转换为 Objective-C 应该很简单。
    • 完全不需要写delegate = self
    • 你会怎么做最后一件事,“定义一个自定义的 MyUrlItemSource 类,根据所选活动返回不同的 URL”
    • @user6631314:除了返回URL而不是String之外,代码相同。
    【解决方案2】:

    Objective-C 等价于 hennes 答案:

    @interface MyStringItemSource : NSObject <UIActivityItemSource>
    {
    
    }
    
    @end
    
    
    @implementation MyStringItemSource
    
    -(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
    {
        return @"";
    }
    
    -(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType
    {
        if (activityType == UIActivityTypeMessage) {
            return @"String for message";
        } else if (activityType == UIActivityTypeMail) {
            return @"String for mail";
        }
        return nil;
    }
    
    -(NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType
    {
        if (activityType == UIActivityTypeMessage) {
            return @"Subject for message";
        } else if (activityType == UIActivityTypeMail) {
            return @"Subject for mail";
        }
        return @"";
    }
    
    -(UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(UIActivityType)activityType suggestedSize:(CGSize)size
    {
        if (activityType == UIActivityTypeMessage) {
            return [UIImage imageNamed: @"thumbnail-for-message"];
        } else if (activityType == UIActivityTypeMail) {
            return [UIImage imageNamed: @"thumbnail-for-mail"];
        }
        return [UIImage imageNamed: @"thumbnail-for-default"];
    }
    
    @end
    

    【讨论】:

      【解决方案3】:

      hennes 相同的解决方案翻译为 swift 3

      class MyStringItemSource: NSObject, UIActivityItemSource {
      
        public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
          return ""
        }
      
        public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
          if activityType == UIActivityType.message {
            return "String for message"
          } else if activityType == UIActivityType.mail {
            return "String for mail"
          } else if activityType == UIActivityType.postToTwitter {
            return "String for twitter"
          } else if activityType == UIActivityType.postToFacebook {
            return "String for facebook"
          }
          return nil
        }
      
        public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
          if activityType == UIActivityType.message {
            return "Subject for message"
          } else if activityType == UIActivityType.mail {
            return "Subject for mail"
          } else if activityType == UIActivityType.postToTwitter {
            return "Subject for twitter"
          } else if activityType == UIActivityType.postToFacebook {
            return "Subject for facebook"
          }
          return ""
        }
      
        public func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivityType?, suggestedSize size: CGSize) -> UIImage? {
          if activityType == UIActivityType.message {
            return UIImage(named: "thumbnail-for-message")
          } else if activityType == UIActivityType.mail {
            return UIImage(named: "thumbnail-for-mail")
          } else if activityType == UIActivityType.postToTwitter {
            return UIImage(named: "thumbnail-for-twitter")
          } else if activityType == UIActivityType.postToFacebook {
            return UIImage(named: "thumbnail-for-facebook")
          }
          return UIImage(named: "some-default-thumbnail")
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 2016-10-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        相关资源
        最近更新 更多