34

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

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

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

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

3 に答える 3

41

私はこの答えを取り、そのための簡単なクラスを作成しました。デフォルトのメッセージは、Twitter 以外の共有手段で表示されます。Twitter の場合、hashWords 配列内の単語は、デフォルトのメッセージに存在する場合、ハッシュと共に表示されます。必要な方に分けてあげようと思いました。ありがとうクリストファー!

使用法:

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
于 2012-11-12T16:59:07.297 に答える
29

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

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

于 2012-09-30T02:42:51.937 に答える
4

UIActivityItemProvider サブクラスの迅速な実装例。コピー オプションではパスワードのみが使用され、他のアクティビティ タイプでは共有テキスト全体が使用されます。さまざまなユースケースに合わせて簡単にカスタマイズできる必要があります。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)
于 2018-02-12T11:31:25.290 に答える