2011-11-06 6 views
1

현재 FromRect 메서드를 사용하여 UIButton에서 AirPrint 옵션을 보여 주므로 모든 것이 예상대로 작동하지만 버튼을 너무 빨리 누르면 EXT_BAD_ACCESS로 인해 응용 프로그램이 충돌합니다.UIPrintInteractionController presentFromRect 문제

ARC를 사용하는 Xcode 4.2를 사용하고 있습니다.

도움이 될 것입니다.

업데이트 2 : 문제는 iOS 5 시뮬레이터에서만 발생하며 iPad 4.3 시뮬레이터는 예상대로 작동합니다.

업데이트 :

응용 프로그램을 종료

* 인해 캐치되지 않는 예외 'NSGenericException', 이유에 : 여기

진짜 문제 '- [UIPopoverController의 dealloc] 팝 오버가 여전히 표시되는 동안했다. ' 여기

내 메소드를 호출하고 있습니다 : 여기

코드입니다

PrintUtils* printUtils = [[PrintUtils alloc] init]; 
printUtils.delegate = self; 
[printUtils setHeader:@"Header"]; 
[printUtils print:self.webView fromRect:self.myButton.frame inView:self.menuView]; 

내 방법 :

- (void)print:(UIWebView *)webView fromRect:(CGRect)rect inView:(UIView *)view 
{ 

    printController = [UIPrintInteractionController sharedPrintController]; 
    [printController setDelegate:self]; 


    if(!printController){ 

     NSError* error = [[NSError alloc] initWithDomain:@"Print unavailable!" code:0 userInfo:nil]; 

     [self showError:error]; 
     return; 
    } 

    UIPrintInteractionCompletionHandler completionHandler = 
    ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { 
     if(!completed && error){ 
      [self showError:error]; 
     } 
    }; 

    UIPrintInfo* printInfo = [UIPrintInfo printInfo]; 
    [printInfo setJobName:header]; 
    [printInfo setDuplex:UIPrintInfoDuplexLongEdge]; 
    [printInfo setOutputType:UIPrintInfoOutputGeneral]; 

    UIPrintFormatter* viewFormatter = [webView viewPrintFormatter]; 

    CustomPrintPageRenderer *pageRenderer = [[CustomPrintPageRenderer alloc] init];  
    [pageRenderer setJobTitle:[printInfo jobName]]; 

    UIFont* font = [UIFont fontWithName:@"Helvetica" size:HEADER_FOOTER_TEXT_HEIGHT]; 
    CGSize titleSize = [pageRenderer.jobTitle sizeWithFont:font]; 
    pageRenderer.headerHeight = pageRenderer.footerHeight = titleSize.height + HEADER_FOOTER_MARGIN_PADDING; 


    [pageRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0]; 

    [printController setPrintPageRenderer:pageRenderer]; 
    [printController setPrintInfo:printInfo];  
    [printController setPrintFormatter:viewFormatter]; 
    [printController setShowsPageRange:YES];  
    [printController presentFromRect:rect inView:view animated:YES completionHandler:completionHandler]; 

} 

UIPrintInteractionControllerDelegate 방법을 구현하는 문제를 해결하기 위해 내 시도 :

- (void)printInteractionControllerWillPresentPrinterOptions:(UIPrintInteractionController *)printInteractionController 
{ 

    if (visible) { 
     [printController dismissAnimated:YES]; 
    } 
} 

답변

2

혹시 이것을 알아 냈습니까? 문제는 기기가 iPad인지 아니면 iPhone인지 확인하지 못하는 것입니다. iPhone은 presentFromRect를 지원하지 않지만 iPad는 지원합니다. 그래서 iPhone에서 실행할 때 나쁜 액세스를 얻습니다. 애니메이션 : completionHandler이 : 원한다면 InView : 애니메이션 아마 같은 조건 코드가 전화 또는 원래 presentFromRect에 사용할 수있다 incidental-했다

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 

    [printController presentFromFromBarButtonItem:sender animated:YES completionHandler:completionHandler]; 

} else { 

    [printController presentAnimated:YES completionHandler:completionHandler]; 

} 
+0

presentFromFromBarButtonItem의 사용 : 여기

은 당신이해야 할 작업은 다음과 같습니다 completionHandler 호출. –