Удаление элементов активности из 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
    }
    ...
}
Другие вопросы по тегам