web-dev-qa-db-ja.com

UIActivityViewControllerでプロバイダーを共有するためのさまざまなデータ

UIActivityViewControllerを1つの長いNSStringとともにデータとして使用しようとしています。 140文字を超える文字列を入力すると、その中のツイートシートに文字列が表示されません。また、コントローラーに渡す前に文字列を切り捨てると、すべてのUIActivitiesに切り捨てられた文字列が含まれます。 Facebookやメッセージを切り捨てたくありません。

異なるUIActivitiesに異なる文字列を与える方法はありますか?

ありがとうございました!

(例:MarcoArmentのTheMagazineアプリは、切り捨てられた文字列の後にUIActivityPostToTwitterに@TheMagazineAppを、その他のUIActivitiesに他のものを含めることでこれを行います。)

24
Mert Dümenci

これがあなたが探しているものだと思います: カスタムUIActivityViewControllerアイコンとテキスト

アクティビティタイプごとに異なるデータを提供できるはずです。

これが誰かに役立つことを願っています。 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];
10
Dmitry

これは、 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)."
        }

        ...
    }

私のブログ投稿の詳細情報: https://www.whitesmith.co/blog/control-what-youre-sharing/

1
ricardopereira

@ Mu-Sonicが提案したように、UIActivityItemSourceに準拠するクラスを作成し、そのインスタンスをアクティビティ項目の配列とともにUIActivityViewController:に渡すことができます。

どのプラットフォームでユーザーが共有しているかを知り、タップされたプラットフォームに依存する特定のデータを返す場合は、public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any?をオーバーライドします。

0
Adriana