【问题标题】:UIPrintInteractionController presentFromRect issueUIPrintInteractionController presentFromRect 问题
【发布时间】:2011-11-06 05:26:34
【问题描述】:

我使用 presentFromRect 方法从 UIButton 显示 AirPrint 选项,一切都按预期工作,但如果我继续按足够快的按钮,我的应用程序会因 EXC_BAD_ACCESS 而崩溃,可能是因为弹出框没有被释放。

我正在使用启用了 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];
    }
}

【问题讨论】:

    标签: objective-c ios ios5 airprint


    【解决方案1】:

    你有想过这个吗?问题是您没有检查设备是 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];
    
    }
    

    【讨论】:

    • presentFromFromBarButtonItem:animated:completionHandler 的使用:可能是偶然的 - 相同的条件代码可用于该调用或原始 presentFromRect:inView:animated:completionHandler 调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多