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

时间:2012-11-25 12:34:00

标签: objective-c ios ios6 uiactivityviewcontroller

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

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

谢谢!

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

4 个答案:

答案 0 :(得分:40)

我认为这就是你要找的东西:Custom UIActivityViewController icons and text

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

答案 1 :(得分: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];

答案 2 :(得分:0)

使用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)."
        }

        ...
    }

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

答案 3 :(得分:0)

您可以创建一个符合UIActivityItemSource的类,然后按照@ Mu-Sonic的建议将其实例和一系列活动项传递给UIActivityViewController:。

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