UIActivityViewController中共享提供程序的不同数据

问题描述 投票:24回答:4

我正在尝试使用UIActivityViewController和一个长NSString作为数据。如果我输入一个> 140个字符的字符串,则其中的推文表格不会显示该字符串。如果我在将字符串提供给控制器之前将其截断,则所有UIActivities都有截断的字符串。我不希望Facebook或消息被截断。

有没有办法给不同的UIActivities提供不同的字符串?

谢谢!

(例如,Marco Arment的The Magazine应用程序通过在UIActivityPostToTwitter中使用截断的字符串跟随@TheMagazineApp以及其他UIActivities中的其他内容来完成此操作。)

objective-c ios ios6 uiactivityviewcontroller
4个回答
40
投票

我想这就是你要找的:Custom UIActivityViewController icons and text

您应该能够为每种活动类型提供不同的数据。


10
投票

希望这有助于某人。如果你继承qa​​zxswpoi,这是非常简单的:

UIActivityItemProvider

然后将其实例与一系列活动项传递给UIActivityViewController:

@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

1
投票

这可以通过使用MyActivityItemProvider *activityItem = [[MyActivityItemProvider alloc] initWithPlaceholderItem:@"Your data"]; NSArray *sharingItems = [NSArray arrayWithObjects: activityItem, _myUITextView.viewPrintFormatter, nil]; UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil]; 对象的可选activityType属性轻松完成。该属性返回UIActivityItemProvider,因此您可以执行以下操作:

UIActivityType

更多信息在我的博客文章中: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)." } ... }


0
投票

您可以创建一个符合https://www.whitesmith.co/blog/control-what-youre-sharing/的类,然后将其实例与活动项数组一起传递给UIActivityViewController:,正如@ Mu-Sonic建议的那样。

如果您想知道用户在哪个平台上共享并返回依赖于分布式平台的任何特定数据,请覆盖UIActivityItemSource

© www.soinside.com 2019 - 2024. All rights reserved.