これには受け入れられた答えがありますが、基本的な質問には実際には答えず、回避策を提供するだけです。
NSView
同様の問題が発生しました(ページごとに1つずつ、同じサブクラスによってレンダリングされたオブジェクトの配列があります)。すべてのページを保持する1つの巨大なビューを作成するというバロック的なナンセンスなしで、私がそれを解決した方法は次のとおりです...
1)NSView
モデルが関連付けられているサブクラスがあります(NSImage
あなたの場合、ModelData
私の場合)
class BaseView: NSView {
var modelData: ModelData /* Whatever your view needs to draw */
//...
}
var models: [ModelData]
2)ドキュメントコントローラーに配列があります。
3)プリンタービューとなる新しいサブクラスを作成します。
class PrinterView: BaseView {
var pageIndex: Int = 1
var modelArray: [ModelData]
init(frame: NSRect, models: [ModelData]) {
self.modelArray = models
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("invalid initializer")
}
override func knowsPageRange(_ range: NSRangePointer) -> Bool {
range.pointee.location = 1
range.pointee.length = self.modelArray.count
return true
}
override func rectForPage(_ page: Int) -> NSRect {
self.pageIndex = page
return self.bounds
}
override func draw(_ dirtyRect: NSRect) {
self.model = self.modelArray[self.page - 1] // Pages are 1, not 0, based
super.draw(dirtyRect)
}
} // That's it! That's all...
4)ドキュメントコントローラでこれを行います。
override func printOperation(withSettings printSettings: [String : Any]) throws -> NSPrintOperation {
self.printInfo.horizontalPagination = .fitPagination
self.printInfo.verticalPagination = .clipPagination
let printView = PrinterView(size: self.printInfo.paperSize, models: self.models)
return NSPrintOperation(view: printView, printInfo: self.printInfo)
}