Estoy intentando implementar una actividad personalizada para las actividades estándar (Imprimir, Correo, FaceBook, etc.) pero por ahora solo quiero la Impresión estándar (para AirPrint) y mi propia impresión personalizada por un método directo. Obviamente me falta algo fundamental ya que ninguno de los métodos de mi clase personalizada se llama. Por ahora, solo tengo una declaración NSLog para descubrir la secuencia de llamadas y para que funcione el framework.Problemas al agregar actividad personalizada a UIActivityController
La siguiente es mi código de prueba para la clase de actividad personalizada:
// PrintActivity.h
#import <UIKit/UIKit.h>
@interface PrintActivity : UIActivity
@end
Y el .m
#import "PrintActivity.h"
@interface PrintActivity()
@property (nonatomic, strong) UIWebView *dummyWebView;
@end
@implementation PrintActivity
- (NSString *)activityType {
NSLog(@"activityType");
return @"MetriScan Print";
}
- (NSString *)activityTitle {
NSLog(@"activityTitle");
return @"MetriScan\nPrint";
}
- (UIImage *)activityImage {
NSLog(@"activityImage");
UIImage *icon = [UIImage imageNamed:@"metriscan_57_c2a_3.png"];
return icon;
}
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
NSLog(@"canPerformWithActivityItems");
return YES;
}
- (void)prepareWithActivityItems:(NSArray *)activityItems {
NSLog(@"prepareWithActivityItems");
}
- (void)performActivity {
NSLog(@"Do the actual printing here");
// My custom code here
}
Y esta es la invocación de la rutina principal:
- (IBAction)printReport:(UIBarButtonItem *)sender {
NSLog(@"Print Report");
PrintActivity *metriscanPrint = [[PrintActivity alloc] init];
UIViewPrintFormatter *printFormatter = [self.webView viewPrintFormatter];
NSArray *activityItems = [NSArray arrayWithObjects:printFormatter, nil];
NSArray *appActivities = [NSArray arrayWithObjects:metriscanPrint, nil];
UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:appActivities];
//activityController.excludedActivityTypes = [NSArray arrayWithObjects:UIActivityTypePostToFacebook, UIActivityTypePostToTwitter, UIActivityTypePostToWeibo, UIActivityTypeMail, UIActivityTypeMessage, nil];
activityController.completionHandler = ^(NSString *activityType, BOOL completed) {
sender.enabled = YES;
};
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
[self presentViewController:activityController animated:YES completion:nil];
} else {
sender.enabled = NO;
self.printPop = [[UIPopoverController alloc] initWithContentViewController:activityController];
[self.printPop presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
}
Como dije, no se llama a ninguno de los métodos de la clase personalizada, pero los iconos de Correo, Mensaje y Copia del sistema se muestran en el hoja de actividad y no el icono Imprimir. Esperaba solo el icono Imprimir del sistema (y el mío).
Si elimino el comentario del bloque superior de instrucciones (y comente NSArray * activityItems ...........) más abajo, los iconos de sistema Correo, Mensaje, Imprimir y Copiar. En este experimento, creo que estoy mezclando diferentes métodos mediante la creación de mi propio formateador, ¿pero esa parecía ser la sugerencia en la WWDC 2012?
Si elimino el comentario de la línea con 'excludeActivityTypes', solo obtengo el icono de Imprimir del sistema.
Me agradaría cualquier entrada para ayudarme a resolver esto.
Y si alguien sabe de algún código de ejemplo para hacer lo que quiero, sería fantástico.
Edit: Código actualizado a mi código de trabajo.
troop231 Gracias por responder la pregunta. Resultó que te había solucionado el problema de forma casi idéntica. Mi confusión original fue qué poner en activityItems y applicationActivities, respectivamente. Para completar, he actualizado el código en mi pregunta original. – bjarne
De nada :) Creo que el potencial de UIActivity es enorme. – klcjr89
Gracias, realmente funciona. ¿Pero este enfoque no se contradice con la advertencia de Apple sobre no anular los servicios del sistema? 'Debería subclase UIActivity solo si desea proporcionar servicios personalizados para el usuario. El sistema ya proporciona soporte para muchos servicios estándar y los hace disponibles a través del objeto UIActivityViewController. Por ejemplo, el controlador de vista de actividad estándar admite datos de correo electrónico, publica elementos en una de las cuentas de redes sociales del usuario y varias otras opciones. No es necesario que proporcione servicios personalizados para ninguno de los tipos incorporados. – Anastasia