Остановка 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{
}