2012-10-04 15 views
12

tengo estos métodos de protocolo,la aplicación del Protocolo UIActivityItemSource

activityViewControllerPlaceholderItem: y activityViewController:itemForActivityType:

pero nunca se llamaron. ¿Cómo le digo al UIActivityViewController que los llame?

También tengo una subclase UIActivityItemProvider, sin embargo, estoy confundido en cuanto a quién llama a estos 2 métodos. Realmente apreciaría un código de muestra, ya que no puedo encontrar nada en la web. :)

Respuesta

14

De acuerdo con la documentación. La matriz de elementos de actividad que pase a
-initWithActivityItems:applicationActivities: puede ser una matriz de objetos de datos, como cadenas o imágenes, o puede ser una matriz de objetos que implementan el protocolo UIActivityItemSource.

Si pasa una matriz de objetos que implementan el protocolo UIActivityItemSource, su instancia de UIActivityViewController llamará a esos métodos en sus elementos de actividad. Esos objetos no necesariamente tienen que ser subclases de UIActivityItemProvider. UIActivityItemProvider es solo una clase que se ajusta a este protocolo.

+2

Ya lo estoy haciendo y, sin embargo, no se están llamando a los métodos. Estoy pasando un objeto 'UIActivityItemProvider' (y sí, implementé el protocolo' UIActivityItemSource' en mi controlador de vista). – Mahouk

+2

no debe implementar el protocolo 'UIActivityItemSource' en su controlador de vista. 'UIActivityItemProvider' implementa los métodos para este protocolo. – Niels

+0

¡Funciona ahora que implementé los métodos en mi subclase 'UIActivityItemProvider'! ¡Muchas gracias! He estado yendo por horas. – Mahouk

26

Puede implementar el protocolo donde lo desee, incluso su controlador de visualización está bien. Simplemente crea una instancia del activityViewController con initWithActivityItems:@[self].

+2

¿Puede decir exactamente por qué necesitamos agregar "self" en "initWithActivityItems:" –

+0

Si configura su ViewController para ser su UIActivityItemSource, entonces necesita decirle al UIActivityViewController. – Leon

17

La respuesta por JotWee me ayudó.

No hay necesidad de subclasificar, los métodos de protocolo UIActivityItemSource se pueden implementar en el controlador de vista donde se implementa el botón Compartir.

muy importante añadir self en elementos de actividad matriz, así (como se sugiere JotWee):

NSArray *activityItems = [NSArray arrayWithObjects:self, url, image, nil]; 

Aquí es mi implementación final:

ViewController.h

@interface ViewController : UIViewController <UIActivityItemSource> 

ViewController .m

- (void)shareBarButtonItemClick:(UIBarButtonItem *)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://example.com"]; 
    NSURL *imageUrl = [NSURL URLWithString:@"http://example.com/images/1.jpg"]; 
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]]; 

    NSArray *activityItems = [NSArray arrayWithObjects:self, url, image, nil]; 

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; 

    [self presentViewController:activityViewController animated:YES completion:nil]; 
} 

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 
{ 
    return @"Summary Text"; 
} 

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController 
{ 
    return @""; 
} 

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType 
{ 
    return @"Subject"; 
} 
Cuestiones relacionadas