Sujeto para UIActivity personalizado

¿Cómo puedo especificar que una UIActivity personalizada UIActivity compatible con un sujeto?

La documentation del protocolo UIActivityItemSource menciona que puede implementar el activityViewController:subjectForActivityType: opcional activityViewController:subjectForActivityType: selector, si desea que la fuente proporcione un asunto:

Al publicar un artículo, el service puede proporcionar un campo de asunto y un campo de datos por separado, como un post de correo electrónico. Implemente este método si desea proporcionar un campo de asunto para los services que admiten uno.

Pero, por lo que puedo decir, no está documentado en ninguna parte cómo puedo especificar que mi UIActivity personalizada sea compatible con un tema. ¿Cómo se hace esto?

Editar: para aclarar mi pregunta

Supongamos que tengo una fuente de elemento de actividad personalizada, digamos DocumentActivityItemSource que implementa el protocolo UIActivityItemSource , y tengo una UIActivity personalizada, a la que podemos llamar SendWithFooMessageActivity .

Luego inicio un UIActivtyViewController:

 NSArray *activityItems = @[[[DocumentActivityItemSource alloc] initWithDocument: document]]; NSArray *applicationActivities = @[[[SendWithFooMessageActivity alloc] init]]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]; [parentViewController presentViewController:activityViewController animated:YES completion:nil]; 

Ahora, en la window emergente, selecciono SendWithFooMessageActivity . El controller de actividad llamará a continuación activityViewController:itemForActivityType: en la instancia DocumentActivityItemSource para get un elemento, que luego enviará a SendWithFooMessageActivity llamando a los objects prepareWithActivityItems: method.

Normalmente, el elemento de actividad sería una image, una cadena o una URL. En este caso, digamos que DocumentActivityItemSource devuelve una cadena con un comentario saliente sobre el documento. SendWithFooMessageActivity , SendWithFooMessageActivity puede usar este text como el cuerpo del text de su post de correo electrónico.

Sin embargo, un post de Foo también requiere que un sujeto sea válido. Curiosamente, el protocolo UIActivityItemSource también contiene el activityViewController:subjectForActivityType: opcional activityViewController:subjectForActivityType: que de hecho está documentado para proporcionar un sujeto a los services que admiten uno.

Para la actividad de correo electrónico proporcionada por Apple, esto sucede de hecho: activityViewController:subjectForActivityType: se activityViewController:subjectForActivityType: en DocumentActivityItemSource y el resultado se utiliza en el correo electrónico como asunto.

Sin embargo, no parece haber una forma de especificar que mi SendWithFooMessageActivity personalizada también quisiera get el tema del elemento de actividad? La documentation menciona que esto sucede para "services que admiten [un sujeto]", entonces, ¿cómo puedo especificar que mi service de hecho lo admita?

Además, lo mismo ocurre con el activityViewController:thumbnailImageForActivityType:suggestedSize: que se supone que proporciona una miniatura a "services que admite uno". Esto funciona para las actividades pnetworkingeterminadas de ShareOnTwitter y ShareOnFacebook, pero no parece haber una forma de activar las actividades personalizadas. es posible?

Hasta ahora he utilizado la solución que @chriszumberge también proporciona a continuación, que consiste en cortocircuitar el ActivityViewController e inicializar directamente la actividad personalizada con la información que necesita de la fuente de elementos:

 [SendWithFooMessageActivity alloc] initWithSubject: document.title]; 

Pero esto no parece ser la forma en que se supone que se UIActivityViewController configuration completa de UIActivityViewController .

Yo recomendaria:

 UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[@"Info you're emailing out."] applicationActivities:nil]; [activityVC setValue:@"Custom Email Subject Here" forKey:@"subject"]; 

Sin embargo, dado que está utilizando una UIActivity personalizada y parece estar usando correo electrónico, voy a asumir que está utilizando MFMailComposeViewController para enviar el correo electrónico.

En ese caso, crearía una propiedad en su UIActivityItemProvider personalizada para la cadena de asunto, y la establecería en cualquier método que UIActivity su UIActivity personalizada y la pasaría al UIActivityViewController . En el proveedor, puede crear un dictionary y establecer la cadena de asunto para cualquier valor key que desee en el

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType

método.

A partir de ahí, en su UIActivity personalizada puede almacenar su tema como una propiedad del dictionary en el método - (UIViewController*) activityViewController , y en ese mismo método, use el código siguiente para inicializar el correo electrónico y establecer el tema.

 MFMailComposeViewController *mailCVC = [[MFMailComposeViewController alloc] init]; mailCVC.mailComposeDelegate = self; [mailCVC setSubject:theSubject]; [mailCVC setMessageBody:theMessage isHTML:NO]; [mailCVC addAttachmentData:theData mimeType:@"text/csv" fileName:theFileName]; 

EDITAR

El protocolo UIActivityItemProvder define los methods utilizados por un object UIActivityViewController para recuperar los elementos de datos para actuar (directamente desde la documentation de Apple). The activityViewController:subjectForActivityType: method es parte del protocolo UIActivityItemSource .

Su UIActivityItemProvider personalizado se ajusta al protocolo UIActivityItemSource de forma pnetworkingeterminada. Ahí es donde debes implementar el método subjectForActivityType:

A continuación, puede usar una sentencia switch/case o un grupo de sentencias if para determinar si el [activityType isEqualToString:@"Custom UIActivity Title"] define en el método activityTitle de UIActivity personalizado. Si es así, devuelva lo que sea la cadena de asunto. Pero esto debe estar en su subclass UIActivityItemProvider personalizada.

No creo que haya una manera automatizada de hacerlo.

En cambio, simplemente llamaría manualmente el método de protocolo en el elemento de origen para get el tema. Haría eso en el código activityViewController o en el método -(void)performActivity .

Por security, puede verificar si se implementó primero:

 NSString *subject = nil; if ([item respondsToSelector:@selector(activityViewController:subjectForActivityType:)] { subject = [item activityViewController:activityViewController subjectForActivityType:activityType]; }