Search code examples
iosxamarinuiactivityviewcontrolleruiactivity

Customize share message based on ActivityType, in Xamarin iOS


I'm trying to make a UIActivityViewController and taler each message to the Activity Type (Email/SMS/Facebook/Twitter/etc). I've read many ways people do this in objective c. But I can't get it working with Xamarin/Monotouch for some reason. Has anyone done this in Xamarin?

Example of this in objective-c: https://www.albertopasca.it/whiletrue/objective-c-custom-uiactivityviewcontroller-icons-and-text/

I've seen some examples do things like pass in an array of activity items along with an array of application activities. How do I do that in Xamarin? The UIActivityTypes are just NSStrings and I can't pass an NSString[] into the constructor for UIActivityViewController

NSObject[] activityItems = new NSObject[] { item1, item2, item3, image };
NSString[] applicationActivities = new NSString[] { UIActivityType.Mail, UIActivityType.PostToTwitter, UIActivityType.Message };

UIActivityViewController activityController = new UIActivityViewController (activityItems, applicationActivities);

I've also tried subclassing UIActivityItemProvider and using the GetItemForActivity method, but I dont' know how to initialize my UIActivityViewController with that UIActivityItemProvider. How do I do that in Xamarin?

public class MyActivityItemProvider : UIActivityItemProvider
{
    public MyActivityItemProvider ()
    {
    }

    public override NSObject GetItemForActivity (UIActivityViewController activityViewController, NSString activityType)
    {
        return base.GetItemForActivity (activityViewController, activityType);
    }
}

Solution

  • Got it. It turns out, you pass your subclassed UIActivityItemProvider in as the activity item...

    Creating the UIActivityViewController using my subclassed UIActivityItemProvider:

    MyActivityItemProvider myActivityItemProvider = new MyActivityItemProvider (new NSString("blah blah blah"));
    NSObject[] activityItems = new NSObject[] { myActivityItemProvider };
    UIActivityViewController activityController = new UIActivityViewController(activityItems, null);
    

    Subclassed UIActivityItemProvider:

    public class MyActivityItemProvider : UIActivityItemProvider
    {
        public MyActivityItemProvider (NSObject a_placeholderItem) : base (a_placeholderItem)
        {
        }
    
        public override NSObject GetItemForActivity (UIActivityViewController activityViewController, NSString activityType)
        {
            if (activityType == UIActivityType.Mail)
            {
                return new NSString("Email body");
            }
            else if (activityType == UIActivityType.Message)
            {
                return new NSString("Message body");
            }
            else if (activityType == UIActivityType.PostToTwitter)
            {
                return new NSString("Tweeeety");
            }
    
            return base.GetItemForActivity (activityViewController, activityType);
        }
    }