Different data for sharing providers in UIActivityViewController

前端 未结 4 1318
忘掉有多难
忘掉有多难 2020-12-01 02:32

I\'m trying to use an UIActivityViewController with one long NSString as the data. If I put a string > 140 characters, the tweet sheet in it does n

相关标签:
4条回答
  • 2020-12-01 02:42

    This can be easily done by using the optional activityType property from the UIActivityItemProvider object. That property returns a UIActivityType, so you can do something like:

    class PhotoActivityItemProvider: UIActivityItemProvider {  
        ...
    
        override var item: Any {
            guard let activityType = self.activityType else {
                return photoURL.absoluteString
            }
            if activityType == .mail || activityType == .message {
                return "The photo link is \(photoURL.absoluteString)."
            }
    
            ...
        }
    

    More information in my blog post: https://www.whitesmith.co/blog/control-what-youre-sharing/

    0 讨论(0)
  • 2020-12-01 02:57

    Hope this helps somebody. It's pretty straightforward if you subclass UIActivityItemProvider:

    @interface MyActivityItemProvider : UIActivityItemProvider
    @end
    
    @implementation MyActivityItemProvider
    
    - (id)item
    {
        // Return nil, if you don't want this provider to apply 
        // to a particular activity type (say, if you provide 
        // print data as a separate item for UIActivityViewController).
        if ([self.activityType isEqualToString:UIActivityTypePrint]) 
            return nil;
    
        // The data you passed while initialising your provider 
        // is in placeholderItem now.
        if ([self.activityType isEqualToString:UIActivityTypeMail] ||
            [self.activityType isEqualToString:UIActivityTypeCopyToPasteboard])
        {
            return self.placeholderItem;
        }
    
        // Return something else for other activities. Obviously, 
        // you can as well reuse the data in placeholderItem here.
        return @"Something else";
    }
    
    @end
    

    Then pass its instance with an array of activity items to UIActivityViewController:

    MyActivityItemProvider *activityItem = 
        [[MyActivityItemProvider alloc] initWithPlaceholderItem:@"Your data"];
    NSArray *sharingItems = [NSArray arrayWithObjects:
        activityItem, _myUITextView.viewPrintFormatter, nil];
    
    UIActivityViewController *activityController = 
        [[UIActivityViewController alloc] 
            initWithActivityItems:sharingItems applicationActivities:nil];
    
    0 讨论(0)
  • 2020-12-01 02:59

    You can create a class that conforms to UIActivityItemSource and then pass its instance with an array of activity items to UIActivityViewController:, as @Mu-Sonic suggested.

    If you want to know in which platform is the user sharing and return any specific data dependent on the tapped platform, override public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any?

    0 讨论(0)
  • 2020-12-01 03:00

    I think this is what you're looking for: Custom UIActivityViewController icons and text.

    You should be able to provide different data for each activity type.

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