web-dev-qa-db-fra.com

Différentes données pour les fournisseurs de partage dans UIActivityViewController

J'essaie d'utiliser une UIActivityViewController avec une longue NSString comme données. Si je mets une chaîne de plus de 140 caractères, la feuille de Tweet qu’elle contient n’affiche pas la chaîne. Et si je tronque la chaîne avant de la donner au contrôleur, tous les UIActivities ont la chaîne tronquée. Je ne veux pas que Facebook ou Message soit tronqué. 

Existe-t-il un moyen de donner différentes chaînes à différentes UIActivities?

Je vous remercie!

L'application The Magazine de Marco Arment, par exemple, utilise une chaîne tronquée suivie de @TheMagazineApp dans UIActivityPostToTwitter, et d'autres éléments dans UIActivities.)

24
Mert Dümenci

Je pense que c’est ce que vous recherchez: Icônes et texte UIActivityViewController personnalisés .

Vous devriez pouvoir fournir des données différentes pour chaque type d'activité.

40

J'espère que ça aide quelqu'un. C'est assez simple si vous sous-classe 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

Ensuite, passez son instance avec un tableau d’activités à 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
Mu-Sonic

Cela peut être facilement fait en utilisant la propriété optionnelle activityType à partir de UIActivityItemProvider object. Cette propriété retourne une UIActivityType, vous pouvez donc faire quelque chose comme:

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

        ...
    }

Plus d'informations dans mon article de blog: https://www.whitesmith.co/blog/control-what-youre-sharing/

0
ricardopereira