我正在实施UIActivityViewController
通过其他应用程序共享文本和图像。当 WhatsApp 不同时接受文本和图像时,我的问题就开始了,因此我想在用户选择与 WhatsApp 共享时删除文本(如果存在)。
如何在选择目标应用程序后删除一些活动项UIActivityViewController
?
我正在实施UIActivityViewController
通过其他应用程序共享文本和图像。当 WhatsApp 不同时接受文本和图像时,我的问题就开始了,因此我想在用户选择与 WhatsApp 共享时删除文本(如果存在)。
如何在选择目标应用程序后删除一些活动项UIActivityViewController
?
首先,您需要创建一个符合 的类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
内容,如果我们认为我们根本不应该发送任何内容,我们可以简单地 return 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
}
...
}