web-dev-qa-db-ja.com

UIActivityViewControllerは、選択したアクティビティに基づいてテキストをカスタマイズします

同じ情報のテキストをカスタマイズしたいのですが、Facebookで共有しているときは、Twitterのハッシュタグや@usernameスキームを使用したくありません...

使用する共有サービスに基づいて、共有するテキストを多様化するにはどうすればよいですか?

もちろん、私はUIActivityViewControllerを使用しています。

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[shareText, shareURL] applicationActivities:nil];
34
Ertai

テキスト文字列をinitWithActivityItems呼び出しに渡す代わりに、 UIActivityItemProvider クラスの独自のサブクラスを渡し、itemForActivityTypeを実装するときにメソッドは、「activityType」パラメータとして共有サービスを提供します。

その後、このメソッドからカスタマイズされたコンテンツを返すことができます。

28

私はこの答えを受け取り、そのための簡単なクラスを作成しました。デフォルトのメッセージは、Twitter以外のアウトレットを共有することで表示され、hashWords配列内のTwitterの単語は、デフォルトのメッセージに存在する場合はハッシュ付きで表示されます。私はそれを必要とする他の人のためにそれを共有すると思いました。クリストファーに感謝します!

使用法:

TwitterHashActivityItemProvider *twit = [[TwitterHashActivityItemProvider alloc] initWithDefaultText:@"I really like stackoverflow and code"
                                                                                           hashWords:@[@"stackoverflow", @"code"]];
NSArray *items = @[twit];
UIActivityViewController *act = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];

ヘッダ:

@interface TwitterHashActivityItemProvider : UIActivityItemProvider

- (id)initWithDefaultText:(NSString*)text hashWords:(NSArray*)hashItems;

@property (nonatomic,strong) NSArray *hashItems;

@end

実装:

#import "TwitterHashActivityItemProvider.h"

@implementation TwitterHashActivityItemProvider

- (id)initWithDefaultText:(NSString*)text hashWords:(NSArray*)hashItems;
{
    self = [super initWithPlaceholderItem:text];
    if ( self )
    {
        self.hashItems = hashItems;
    }
    return self;
}

- (id)item
{
    if ( [self.placeholderItem isKindOfClass:[NSString class]] )
    {
        NSString *outputString = [self.placeholderItem copy];

        // Twitter gets some hash tags!
        if ( self.activityType == UIActivityTypePostToTwitter )
        {
            // go through each potential hash item and augment the main string
            for ( NSString *hashItem in self.hashItems)
            {
                NSString *hashed = [@"#" stringByAppendingString:hashItem];
                outputString = [outputString stringByReplacingOccurrencesOfString:hashItem withString:hashed];
            }
        }

        return outputString;
    }

    // else we didn't actually provide a string...oops...just return the placeholder
    return self.placeholderItem;
}

@end
40
NickNack

UIActivityItemProviderサブクラスのSwift実装例。コピーオプションはパスワードのみを使用し、他のアクティビティタイプは完全な共有テキストを使用します。さまざまなユースケースに合わせて簡単にカスタマイズできる必要があります。彼らの答えはCristopher&NickNackの功績によるものです。

class PasswordShareItemsProvider: UIActivityItemProvider {

    private let password: String

    private var shareText: String {
        return "This is my password: " + password
    }

    init(password: String) {
        self.password = password
        // the type of the placeholder item is used to
        // display correct activity types by UIActivityControler
        super.init(placeholderItem: password)
    }

    override var item: Any {
        get {
            guard let activityType = activityType else {
                return shareText
            }

            // return desired item depending on activityType

            switch activityType {
            case .copyToPasteboard: return password
            default: return shareText
            }
        }
    }
}

使用法:

let itemProvider = PasswordShareItemsProvider(password: password)
let activityViewController = UIActivityViewController(activityItems: [itemProvider], applicationActivities: nil)
3
pkorosec