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

24

我尝试使用一个长的NSString作为数据来使用 UIActivityViewController。如果字符串超过140个字符,则其中的tweet表单不会显示该字符串。如果在将字符串提供给控制器之前截断字符串,则所有UIActivities都将具有被截断的字符串。但我不想让Facebook或信息被截断。

是否有一种方法可以给不同的UIActivities分别提供不同的字符串?

谢谢!

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

4个回答

40

3
如果您想自定义现有的提供程序(如FB、Twitter等)--->-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType - 是您想要编辑的函数 - 这是您决定哪些项目将被发布的地方。 - Oded Regev
我不明白如何独立修改Facebook/Twitter等文本... 您是否需要为每个想要不同的文本初始化APActivityProvider? - shim
http://stackoverflow.com/questions/26451583/uiactivityview-controller-behaviour-is-strange - Mian Muhammad Umair Liaqat
我已将我的项目升级到SDK 9.x,并在APActivityProvider *ActivityProvider = [[APActivityProvider alloc] init]上收到('init'不可用)错误。我该如何解决? - OXXY

11
希望这能帮到某些人。如果您使用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

然后将其实例与活动项数组一起传递给UIActivityViewController:

MyActivityItemProvider *activityItem = 
    [[MyActivityItemProvider alloc] initWithPlaceholderItem:@"Your data"];
NSArray *sharingItems = [NSArray arrayWithObjects:
    activityItem, _myUITextView.viewPrintFormatter, nil];

UIActivityViewController *activityController = 
    [[UIActivityViewController alloc] 
        initWithActivityItems:sharingItems applicationActivities:nil];

1
这正是分享不同类型数据所需的。只需子类化尽可能多的UIActivityItemProviders,每种数据类型一个。 - Timo Ylikännö
由于“item”被标记为非空,因此您不应返回nil。 - Ruslan Mansurov

2

通过使用 UIActivityItemProvider 对象中的可选 activityType 属性,可以轻松完成此操作。该属性返回一个 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)."
        }

        ...
    }

我的博客文章中有更多关于it技术的资讯:https://www.whitesmith.co/blog/control-what-youre-sharing/


0

您可以创建一个符合 UIActivityItemSource 协议的类,然后将其实例与活动项数组一起传递给 UIActivityViewController,就像 @Mu-Sonic 建议的那样。

如果您想知道用户在哪个平台上分享,并返回特定于所选平台的任何特定数据,请重写 public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接