【问题标题】:Stopping NSPrintOperation From Crashing Application从崩溃的应用程序中停止 NSPrintOperation
【发布时间】:2017-06-16 03:41:06
【问题描述】:

我有以下代码行来打印webView 内容。

let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let printOpts: NSDictionary = [NSPrintJobDisposition: NSPrintSaveJob, NSPrintSaveJob: directoryURL, NSPrintScalingFactor: 2.0]
let printInfo = NSPrintInfo(dictionary: printOpts as! [String : AnyObject])

printInfo.horizontalPagination = .autoPagination
printInfo.verticalPagination = .autoPagination

let printOperation = NSPrintOperation(view: webView.mainFrame.frameView, printInfo: printInfo)
printOperation.printPanel.options = [.showsOrientation, .showsPaperSize, .showsPreview, .showsPageSetupAccessory, .showsScaling, .showsPrintSelection]
printOperation.run()

问题是当用户与打印操作面板交互时,有时会导致应用程序崩溃。

如果我只是单击取消按钮,应用程序可能会崩溃。如果我尝试设置不同的缩放率,它有时会崩溃。我不知道为什么应用程序会崩溃。它总是最后一行。我究竟做错了什么?谢谢。

【问题讨论】:

    标签: swift cocoa swift3 nsprintoperation


    【解决方案1】:

    .showsCopies 在选项中不是 时,打印面板代码中存在错误。它具有与副本相关的子视图的释放后使用错误。它将它们从视图层次结构中删除,允许它们被释放。但是,它保留对文本字段的悬空引用,并尝试在各种情况下对其进行操作。例如,它有时会尝试使其成为第一响应者。

    您基本上不应该尝试禁止复制字段。

    【讨论】:

    • 谢谢。所以你的意思是,我只需要在选项字典中包含 showCopies 吗?如果我向 G man 询问“showsCopies NSPrintOperation”,我找不到任何文献。
    • 应用程序仍然偶尔会因“showsCopies”而崩溃。
    • 对不起,有一个错字,我现在已经更正了。它是.showsCopies,带有三个“s”。 developer.apple.com/documentation/appkit/nsprintpanel.options/…
    • 可能还有其他类似的错误。尝试不设置选项,因此您使用 Apple 可能已经更彻底测试过的默认值。
    • 好吧,首先看看崩溃是否停止使用默认选项。如果是这样,请尝试,而不是从头开始构建选项集,而是检索默认选项并添加 .showsScaling
    【解决方案2】:

    我用于从 OS X 的 URL 打印 pdf 的代码:

    let printInfo = NSPrintInfo.shared
    let manager = FileManager.default
    do{
        let directoryURL = try manager.url(for: .documentDirectory, in:.userDomainMask, appropriateFor:nil, create:true)
        let docURL = NSURL(string:"XX.pdf", relativeTo:directoryURL)
    
        let pdfDoc =  PDFDocument.init(url: docURL! as URL)
    
        let page = CGRect(x: 0, y: 0, width: 595.2, height: 1841.8) // A4, 72 dpi
    
        let pdfView : PDFView = PDFView.init(frame: page)
    
        pdfView.document = pdfDoc
    
        let operation: NSPrintOperation = NSPrintOperation(view: pdfView, printInfo: printInfo)
        operation.printPanel.options.insert(NSPrintPanel.Options.showsPaperSize)
        operation.printPanel.options.insert(NSPrintPanel.Options.showsOrientation)
    
        operation.run()
    }catch{
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      相关资源
      最近更新 更多