首先,你需要创建一个符合UIActivityItemSource的类,并使用它而不是直接将文本或图像传递给UIActivityViewController。
所以不是
UIActivityViewController(activityItems: [image, text])
我们会传递新的物品来源
UIActivityViewController(activityItems: [ImageItemSource(image), TextItemSource(text)]
项目源类将如下所示:
class TextItemSource: NSObject, UIActivityItemSource {
private let text: String
init(text: String) {
self.text = text
super.init()
}
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
text
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
text
}
}
class ImageItemSource: NSObject, UIActivityItemSource {
private let image: UIImage
init(image: UIImage) {
self.image = image
super.init()
}
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
image
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
image
}
}
现在我们可以控制要分享的内容,我们可以确切选择我们与每个应用分享的内容,方法是在返回数据之前检查activityType,如果我们认为我们不应该发送无论如何,我们可以简单地返回nil。
在您的情况下,如果您想与除 WhatsApp 之外的所有应用程序共享文本项,您只需执行以下操作:
class TextItemSource: NSObject, UIActivityItemSource {
...
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
if activityType?.rawValue.starts(with: "net.whatsapp.WhatsApp.") == true {
// We'll return `nil` to WhatsApp forcing it to
// ignore this whole text item and only show the image item instead
return nil
}
return text
}
...
}