为 UIActivityViewController Swift 设置不同的 activity 项

Set different activity items for UIActivityViewController Swift

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

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

你知道这在 iOS8 和 Swift 中是否可行吗?

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

您应该利用 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")
    }
}

以上项目来源 returns 基于 activity 类型的不同字符串数据对象、主题和缩略图。要使用,您只需将其传递给 UIActivityViewController 初始化程序。

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

同样,您可以定义一个自定义 MyUrlItemSource class,根据所选 activity returns 不同的 URL,并将其传递到初始化程序中。

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

所有这些都在 UIActivityViewController and UIActivityItemSource

的官方文档中进行了概述

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")
  }

}

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