カスタム アクティビティを標準のアクティビティ (印刷、メール、FaceBook など) に実装しようとしていますが、今のところ、標準の印刷 (AirPrint 用) と独自のカスタム印刷のみが直接的な方法で必要です。カスタムクラスのメソッドが呼び出されないため、明らかに基本的なものが欠けています。今のところ、呼び出しシーケンスを把握し、フレームワークを機能させるための NSLog ステートメントしかありません。
以下は、カスタム アクティビティ クラスのテスト コードです。
// PrintActivity.h
#import <UIKit/UIKit.h>
@interface PrintActivity : UIActivity
@end
そして、.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
}
そして、これはメイン ルーチンでの呼び出しです。
- (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];
}
前述したように、カスタム クラスのメソッドは呼び出されませんが、システムのメール、メッセージ、およびコピー アイコンはアクティビティ シートに表示され、印刷アイコンは表示されません。システムの [印刷] アイコン (および自分のアイコン) だけを期待していました。
ステートメントの一番上のブロックのコメントを外すと (そして NSArray *activityItems ............ をコメント アウトすると)、システム メール、メッセージ、印刷、およびコピーの各アイコンが表示されます。この実験では、独自のフォーマッターを作成してさまざまな方法を組み合わせていると思いますが、それは WWDC 2012 での提案のようでした。
次に、「excludeActivityTypes」の行のコメントを外すと、システムの印刷アイコンのみが表示されます。
これを理解するのに役立つ情報を歓迎します。
そして、私がやりたいことを実行するためのコード例を誰かが知っていれば、それは素晴らしいことです.
編集:コードを作業コードに更新しました。