How can you customize UIActivityViewController to ONLY include custom UIActivity types?

前端 未结 1 1172
悲哀的现实
悲哀的现实 2020-12-18 16:25

I\'m trying to customize the native ios UIActivityViewController so it will restrict every UIActivity except for the custom UIActivity

1条回答
  •  天涯浪人
    2020-12-18 16:30

    My colleague was able to figure this out. For anyone wondering how to display only the applicationActivities (custom activities) on the share sheet, this is how I did it.

    For activityItems rather than creating an array of strings, create an array of your custom data objects. Then override the canPerform(withActivityItems activityItems: [Any]) method in your custom UIActivity (subclass of UIActivity) to return true if activityItems[o] is CustomItem. Since your activityItems are custom, system will not display other apps on the share sheet. That's it.

    In the example below, only your CustomUIActivity will be displayed on the share sheet.

    let items = [CustomItem("Hello world")]
    
    let activitySheet = UIActivityViewController(
                activityItems: items,
                applicationActivities: [
                    CustomUIActivity()
                ]
            )
    
    class CustomItem {
    
        let value: String
    
        required init(value: String) {
            self.value = value
        }
    
        func getValue() -> String {
            return self.value
        }
    }
    
    @objc(CustomUIActivity)
    class CustomUIActivity: UIActivity {
    
        override class var activityCategory: UIActivity.Category {
            return .share
        }
    
        override var activityType: UIActivity.ActivityType? {
            return .customuiactivity
        }
    
        override var activityTitle: String? {
            return "Custom"
        }
    
        override var activityImage: UIImage? {
            return UIImage(named: "custom-icon")
        }
    
        override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
            if activityItems.count == 1 && activityItems[0] is CustomItem {
                return true
            }
            return false
        }
    
        var textToShare: String?
    
        override func prepare(withActivityItems activityItems: [Any]) {
            if let activityItem = activityItems.first as? CustomItem {
                self.textToShare = activityItem.getValue
            }
        }
    
        override func perform() {
            // perform your custom activity with `textToShare`
            activityDidFinish(true)
        }
    }
    
    extension UIActivity.ActivityType {
        static let customuiactivity =
            UIActivity.ActivityType("com.ceylonese.mobile.customuiactivity")
    }
    

    0 讨论(0)
提交回复
热议问题