UIPrintInteractionController presentFromRect выпуск - PullRequest
1 голос
/ 06 ноября 2011

Я показываю параметры AirPrint из UIButton, используя метод presentFromRect, все работает как положено, но если я продолжаю нажимать кнопку достаточно быстро, мое приложение аварийно завершает работу с EXC_BAD_ACCESS, возможно, из-за того, что всплывающее окно не выпускается.

Я использую Xcode 4.2 с включенной ARC.

Любая помощь будет отличной!

Обновление 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];
    }
}

1 Ответ

2 голосов
/ 28 февраля 2012

Вы когда-нибудь понимали это?Проблема в том, что вы не проверяете, является ли устройство iPad или iPhone.iPhone не поддерживает presentFromRect: но iPad поддерживает.Вот почему вы получаете плохой доступ при запуске его на iPhone.

Вот что вам нужно сделать:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

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

} else {

    [printController presentAnimated:YES completionHandler:completionHandler];

}
...