程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了无法使用 NStableView Data Cocoa App 打印多页打印预览大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决无法使用 NStableView Data Cocoa App 打印多页打印预览?

开发过程中遇到无法使用 NStableView Data Cocoa App 打印多页打印预览的问题如何解决?下面主要结合日常开发的经验,给出你关于无法使用 NStableView Data Cocoa App 打印多页打印预览的解决方法建议,希望对你解决无法使用 NStableView Data Cocoa App 打印多页打印预览有所启发或帮助;

我想将 NStableVIEw 数据打印为多页打印预览,但打印预览仅显示前几条记录其余页面为空。我正在使用以下代码打印 NStableVIEw 数据。

let prinTinfo = nsprinTinfo.shared
prinTinfo.paperSize = NSSize(wIDth: self.reporttablevIEw.frame.wIDth,height: 800.00)
prinTinfo.verticalPagination = .automatic
let operation: nsprintoperation = nsprintoperation(vIEw: self.reporttablevIEw,prinTinfo: prinTinfo)
operation.printPanel.options.insert([.showsPaperSize,.showsOrIEntation])
operation.run()

上面的代码工作正常,最小记录数为 30 -40 行,但当记录数约为 100 或超过 100 时,它只打印前几条记录,其余页面为空。任何帮助将不胜感激。我附上了 tablevIEw 和 Print预览屏幕截图以更好地理解。

  1. tableVIEw 记录: Table view screen shot
  2. 打印预览: Print preview screen shot 你可以在上面的屏幕截图中看到只有前几页有记录的其余部分是空的。如果我滚动表格视图在这种情况下整个打印预览是空的。 Empty print preview screen shot

我无法理解我做错了什么。

解决方法

我遇到了同样的问题。我相信这是由 AppKit 用来有效显示 NSTableViews 的方法引起的。这似乎优化了,即减少了大型 NSTableViews 的内存负载,只为视图的大约 3 个“页面”生成显示数据。要打印整个 NSTableView,请在打印前将 NSTableView 实例属性 var usesStaticContents: Bool { get set } 设置为 true(并在打印完成后将其值返回为 false)。我已经在一张 33 x A4 横向页面的表格上成功地测试了这个,它工作正常(然在显示打印面板之前需要大约 5 秒)。

这是对我有用的代码:

struct ReportsDetailView: View {
        
    @Binding var reportNodes: [ReportNode]
    @State private var viewToPrint = NSView()
    @State private var prinTing = false

    var body: some View {
        VStack {
            ReportsDetailTableVC(reportNodes: $reportNodes,viewToPrint: $viewToPrint,prinTing: $prinTing)
            HStack {
                Spacer()
                Button("Print Report") {
                    prinTing = true
                    let scale: CGFloat = 800/viewToPrint.frame.width
                    let prinTinfo = NSPrinTinfo()
                    prinTinfo.horizontalPagination = .automatic
                    prinTinfo.verticalPagination = .automatic
                    prinTinfo.isVerticallyCentered = true
                    prinTinfo.isHorizontallyCentered = true
                    prinTinfo.printer = NSPrinter(name: NSPrinter.printerNames[0])!
                    prinTinfo.paperSize = NSSize(width: 595.28,height: 841.89)
                    prinTinfo.topMargin = 10
                    prinTinfo.bottomMargin = 10
                    prinTinfo.leftMargin = 10
                    prinTinfo.rightMargin = 10
                    prinTinfo.orientation = .landscape
                    prinTinfo.scalingFactor = scale
                    let printOperation = NSPrintOperation(view: viewToPrint,prinTinfo: prinTinfo)
                    printOperation.run()
                    prinTing = false
                }
                .disabled(prinTing)
            }
            .padding(10)
        }
        .frame(maxWidth: .infinity,maxHeight: .infinity)
    }
}

struct ReportsDetailTableVC: NSViewControllerRepresentable {
    
    @Environment(\.colorscheR_289_11845@E) var colorscheR_289_11845@e
    
    @Binding var reportNodes: [ReportNode]
    @Binding var viewToPrint: NSView
    @Binding var prinTing: Bool
    
    func makeNSViewController(context: Context) -> some NSViewController {
        let reportsDetailVC = ReportsDetailTableViewController()
        return reportsDetailVC
    }
    
    func updateNSViewController(_ nsViewController: NSViewControllerType,context: Context) {
        guard let reportsDetailVC = nsViewController as? ReportsDetailTableViewController else {return}
        reportsDetailVC.setContents(reportNodes: reportNodes)
        if prinTing {
            reportsDetailVC.tableView.scrollRowToVisible(0)
            reportsDetailVC.tableView.usesStaticContents = true
            reportsDetailVC.tableView.appearance = NSAppearance(named: .aqua)
            reportsDetailVC.tableView.usesAlternaTingRowBACkgroundColors = false
        }
        else {
            reportsDetailVC.tableView.usesStaticContents = false
            reportsDetailVC.tableView.appearance = colorscheR_289_11845@e == .light ? NSAppearance(named: .aqua) : NSAppearance(named: .darkAqua)
            reportsDetailVC.tableView.usesAlternaTingRowBACkgroundColors = true
        }
        DispatchQueue.main.async {viewToPrint = reportsDetailVC.tableView}
    }
}

大佬总结

以上是大佬教程为你收集整理的无法使用 NStableView Data Cocoa App 打印多页打印预览全部内容,希望文章能够帮你解决无法使用 NStableView Data Cocoa App 打印多页打印预览所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:无法使用