표준 액티비티 (Print, Mail, FaceBook 등)에 대한 커스텀 액티비티를 구현하려고하는데, 현재는 표준 인쇄 (AirPrint 용)와 직접적인 방법. 내 커스텀 클래스의 메서드 중 아무 것도 호출되지 않기 때문에 분명히 근본적인 것이 빠져있다. 지금은 호출 시퀀스를 파악하고 프레임 워크가 작동하도록하는 NSLog 문만 있습니다. UIActivityController에 사용자 정의 액티비티를 추가 할 때의 문제
다음
내 테스트 사용자 정의 작업 클래스에 대한 코드입니다// 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];
}
내가 말했듯이, 커스텀 클래스의 어떤 메소드도 호출되지 않지만 Mail, Message, Copy 아이콘 시스템은 인쇄 아이콘이 아니라 활동 시트. 나는 단지 시스템 인쇄 아이콘 (그리고 내 자신)을 기대했다.
NSArray * activityItems ... 구문을 주석 처리하고 NSArray * activityItems ...를 주석 처리하면 메일, 메시지, 인쇄 및 복사 아이콘이 표시됩니다. 이 실험에서 저는 자체 포맷터를 작성하여 여러 가지 방법을 혼합하고 있다고 생각하지만 WWDC 2012에서 제안한 것 같았습니까?
'excludeActivityTypes'로 줄의 주석을 제거하면 시스템 인쇄 아이콘 만 표시됩니다.
나는 이것을 이해하는 데 도움이되는 의견을 환영합니다.
그리고 누군가 내가 원하는 것을 수행 할 수있는 예제 코드를 알고 있다면 그것은 훌륭 할 것입니다.
편집 : 코드를 제 작업 코드로 업데이트했습니다.
troop231 질문에 답변 해 주셔서 감사합니다. 내가 당신과 거의 똑같이 문제를 해결 했음이 밝혀졌습니다. 내 원래의 혼동은 각각 activityItems와 applicationActivities에 넣어야 할 것이었다. 완성을 위해 원래 질문에서 코드를 업데이트했습니다. – bjarne
당신은 환영합니다 :) 나는 UIActivity의 잠재력이 크다고 생각합니다. – klcjr89
감사합니다. 실제로 작동합니다. 그러나이 접근 방식이 시스템 서비스를 무시하지 말라는 경고와 모순되지 않습니까? 사용자에게 맞춤 서비스를 제공하려는 경우에만 UIActivity의 하위 클래스를 만들어야합니다. 이 시스템은 이미 많은 표준 서비스에 대한 지원을 제공하고 UIActivityViewController 객체를 통해 사용할 수 있도록합니다. 예를 들어, 표준 액티비티 뷰 컨트롤러는 데이터 이메일 전송, 사용자의 소셜 미디어 계정 중 하나에 항목 게시 및 기타 여러 옵션을 지원합니다. 당신은 기본 제공되는 유형에 대한 맞춤 서비스를 제공 할 필요가 없습니다. ' – Anastasia