Sto cercando di implementare un'attività personalizzata per le attività standard (Stampa, Mail, FaceBook, ecc.) Ma per ora voglio solo la Stampa standard (per AirPrint) e la mia stampa personalizzata da un metodo diretto. Ovviamente mi manca qualcosa di fondamentale in quanto nessuno dei metodi nella mia classe personalizzata viene mai chiamato. Per ora ho solo alcune istruzioni NSLog per capire la sequenza di chiamata e per far funzionare il framework.Problemi nell'aggiungere attività personalizzate a UIActivityController
Quello che segue è il mio codice di prova per la classe di attività personalizzata:
// PrintActivity.h
#import <UIKit/UIKit.h>
@interface PrintActivity : UIActivity
@end
E il .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
}
E questo è l'invocazione nella routine principale:
- (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];
}
Come ho detto, nessuno dei metodi nella classe personalizzata viene chiamato, ma le icone di sistema Mail, Message e Copy mostrano nel foglio di attività e non l'icona Stampa. Mi aspettavo solo l'icona Stampa di sistema (e la mia).
Se annullo il primo blocco di istruzioni (e commenta l'oggetto NSArray * activityItems ...........) più in basso, le icone di posta, messaggio, stampa e copia del systme. In questo esperimento penso di mescolare diversi metodi creando il mio formattatore, ma quello è sembrato essere il suggerimento al WWDC 2012?
Se si annulla la riga con "excludeActivityTypes", viene visualizzata solo l'icona Stampa di sistema.
Gradirei qualsiasi input per aiutarmi a capirlo.
E se qualcuno sa di codice di esempio per fare quello che voglio, sarebbe fantastico.
Modifica: Codice aggiornato al mio codice di lavoro.
troop231 grazie per aver risposto alla domanda. Risulta che ho risolto il problema in modo quasi identico a te. La mia confusione originale era cosa mettere in attività, rispettivamente, Item e ApplicationActivities. Per completezza ho aggiornato il codice nella mia domanda originale. – bjarne
Prego :) Penso che il potenziale di UIActivity sia enorme. – klcjr89
Grazie, funziona davvero. Ma questo approccio non contraddice l'avvertimento di Apple riguardo al non sovrascrivere i servizi di sistema? 'Dovresti sottoclasse UIActivity solo se desideri fornire servizi personalizzati all'utente. Il sistema fornisce già il supporto per molti servizi standard e li rende disponibili tramite l'oggetto UIActivityViewController. Ad esempio, il controller di visualizzazione attività standard supporta i dati via e-mail, la pubblicazione di elementi in uno degli account di social media dell'utente e diverse altre opzioni. Non è necessario fornire servizi personalizzati per nessuno dei tipi predefiniti. – Anastasia