24

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

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

谢谢!

(例如,Marco Arment 的 The Magazine 应用程序通过在 @TheMagazineApp 中添加一个截断的字符串UIActivityPostToTwitter以及在 other 中的其他内容来做到这一点UIActivities。)

4

4 回答 4

40

我认为这就是您要寻找的内容:自定义 UIActivityViewController 图标和文本

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

于 2012-11-25T12:43:12.423 回答
10

希望这可以帮助某人。如果您将其子类化,这非常简单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];
于 2014-11-05T17:37:03.780 回答
1

这可以通过使用对象的可选activityType属性轻松完成UIActivityItemProvider。该属性返回 a 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)."
        }

        ...
    }

我的博文中的更多信息:https ://www.whitesmith.co/blog/control-what-youre-sharing/

于 2018-11-20T10:01:26.993 回答
0

您可以创建一个符合的类,UIActivityItemSource然后将其带有活动项数组的实例传递给 UIActivityViewController:,正如@Mu-Sonic 建议的那样。

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

于 2019-04-22T10:17:02.943 回答