2012-09-28 8 views
32

quiero personalizar el texto de la misma información pero cuando estoy compartiendo en Facebook no quiero utilizar las etiquetas de hash de twitter o esquema de nombre de usuario @ ...UIActivityViewController personalizar el texto sobre la base de esta actividad fue seleccionado

Cómo ¿Puedo diversificar el texto para compartir basado en qué servicio de intercambio se usaría?

Por supuesto que estoy usando UIActivityViewController:

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

Respuesta

27

En lugar de pasar las cadenas de texto en la llamada initWithActivityItems, pase en su propia subclase de la clase UIActivityItemProvider y cuando se implementa el método itemForActivityType Proporcionará el servicio compartido como el parámetro 'activityType'.

A continuación, puede devolver el contenido personalizado de este método.

+0

Muchas gracias por esta respuesta :) – Ertai

+9

un código de ejemplo sería grande para dar cuerpo a cabo esta respuesta –

+1

Gran respuesta, gracias. Se agregó un rápido ejemplo a continuación. – pkorosec

39

Tomé esta respuesta e hice una clase simple para ello. El mensaje predeterminado se verá compartiendo puntos de venta que no sean Twitter, y las palabras de Twitter dentro de la matriz de hashWords aparecerán con valores hash si están presentes en el mensaje predeterminado. Pensé que podría compartirlo con cualquier otra persona que lo necesite. Gracias Christopher!

Uso:

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]; 

Cabecera:

@interface TwitterHashActivityItemProvider : UIActivityItemProvider 

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

@property (nonatomic,strong) NSArray *hashItems; 

@end 

Implementación:

#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 
+5

¿Debería 'self.activityType == UIActivityTypePostToTwitter' be' [self.activityType isEqualToString: UIActivityTypePostToTwitter] 'o puede uno usar los punteros? –

1

ejemplo la rápida aplicación de la subclase UIActivityItemProvider. La opción de copia usará solo la contraseña, otros tipos de actividad utilizarán el texto completo. Debería ser fácil de personalizar para diferentes casos de uso. Crédito a Cristopher & NickNack por sus respuestas.

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 
      } 
     } 
    } 
} 

Uso:

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