Uiactivityviewcontroller настройка текста на основе выбранного действия

Я хочу настроить текст для той же информации, но когда я делюсь им на Facebook, я не хочу использовать хэш-теги twitter или схему @username...

Как я могу диверсифицировать текст для совместного использования на основе того, какая служба общего доступа будет использоваться?

конечно, я использую UIActivityViewController:

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

3 ответов


вместо передачи текстовых строк в initWithActivityItems звоните, проходите в свой собственный подкласс UIActivityItemProvider класс и когда вы реализуете itemForActivityType метод он предоставит службу общего доступа в качестве параметра "activityType".

затем вы можете вернуть настроенное содержимое от этого метода.


Я взял этот ответ и сделал для него простой класс. Сообщение по умолчанию будет видно в других торговых точках, кроме Twitter, а для слов 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

пример реализации Swift подкласса 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)