Удаление элементов активности из UIActivityViewController после выбора WhatsApp
Я реализую UIActivityViewController
обмениваться текстом и изображениями через другие приложения. Моя проблема начинается, когда WhatsApp не принимает текст и изображение вместе, поэтому я хочу удалить текст (если существует), когда пользователь решает поделиться с WhatsApp.
Как я могу удалить некоторые элементы деятельности после того, как приложение назначения было выбрано в UIActivityViewController
?
0 ответов
Прежде всего, вам нужно создать класс, соответствующий 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
}
...
}