Probleme beim Hinzufügen benutzerdefinierter Aktivitäten zu UIActivityController

Ich versuche, eine benutzerdefinierte Aktivität für die Standardaktivitäten (Drucken, Mailen, Facebook usw.) zu implementieren, möchte jedoch vorerst nur den Standarddruck (für AirPrint) und meinen eigenen benutzerdefinierten Druck auf direktem Wege. Ich vermisse offensichtlich etwas Grundlegendes, da keine der Methoden in meiner benutzerdefinierten Klasse jemals aufgerufen wird. Im Moment habe ich nur eine NSLog-Anweisung, um die Aufrufsequenz herauszufinden und das Framework zum Funktionieren zu bringen.

Das Folgende ist mein Testcode für die benutzerdefinierte Aktivitätsklasse:

//  PrintActivity.h

#import <UIKit/UIKit.h>

@interface PrintActivity : UIActivity

@end

Und sie

#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

}

Und dies ist der Aufruf in der Hauptroutine:

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

Wie bereits erwähnt, wird keine der Methoden in der benutzerdefinierten Klasse aufgerufen, aber die Symbole Mail, Nachricht und Kopieren des Systems werden im Aktivitätsblatt und nicht das Symbol Drucken angezeigt. Ich habe nur das System-Drucksymbol (und mein eigenes) erwartet.

Wenn ich den oberen Anweisungsblock auskommentiere (und die NSArray * -Aktivitätselemente auskommentiere .........), werden die Symbole systme Mail, Message, Print und Copy angezeigt. In diesem Experiment denke ich, dass ich verschiedene Methoden mische, indem ich meinen eigenen Formatierer erstelle, aber das schien der Vorschlag auf der WWDC 2012 zu sein?

Wenn ich dann die Zeile mit 'excludeActivityTypes' auskommentiere, erhalte ich nur das System-Drucksymbol.

Ich würde jede Eingabe begrüßen, um mir zu helfen, dies herauszufinden.

Und wenn jemand einen Beispielcode kennt, um das zu tun, was ich will, wäre das großartig.

Bearbeiten: Der Code wurde auf meinen Arbeitscode aktualisiert.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage