Остановка NSPrintOperation из аварийного приложения

У меня есть следующие строки кода для печати 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()

Проблема заключается в том, что иногда происходит сбой приложения при взаимодействии пользователя с панелью операций печати.

введите описание изображения здесь

Если я просто нажму на кнопку отмены, приложение может аварийно завершить работу. И если я попытаюсь установить другую шкалу, она может иногда зависать. Я не знаю, почему приложение зависнет. Это всегда последняя строка. Что я делаю неправильно? Благодарю.

введите описание изображения здесь

2 ответа

Существует ошибка в коде панели печати, когда .showsCopies нет в опциях. У него есть ошибка "использовать после освобождения" с подпредставлениями, связанными с копиями. Это удаляет их из иерархии представления, позволяя им быть освобожденными. Тем не менее, он сохраняет свисающую ссылку на текстовое поле и пытается воздействовать на него при различных обстоятельствах. Например, иногда он пытается сделать его первым респондентом.

В принципе, вам никогда не следует подавлять поле "Копии".

Мой код для печати PDF из URL для OS X:

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{

}
Другие вопросы по тегам