我正在尝试通过自定义NSTableView
打印填充在NSView
中的数据。当用户发出打印命令时,包含NSView
的自定义NSTableView
将按预期显示在“打印面板”中
我遇到的问题如下:如果用户更改了“打印面板”中的任何设置,填充NSTableView
的数据将被清空。如果用户单击“打印”,则会发生相同的情况我的问题:当用户与打印面板交互时,如何使数据不消失?
其他信息:(1)NSView
中的标签按预期显示,(2)如果我绕过打印面板,则发出[printOp setShowsPrintPanel:NO]; [printOp runOperation];
NSTableView
中的数据按预期打印。
推测:我正在更新程序以使用自动引用计数(ARC)。看起来好像早期发布了指向数据的指针,这样当用户与打印面板交互时,NSView
就无法再获得数据了。但是我无法确定发生了什么(就我所知,在首次出现打印面板后,我的代码未被访问)。
非常感谢任何帮助。谢谢。附上一些有助于诊断的代码。
来自MyDocument.m(NSDocument
的子类),启动打印操作的代码:
-(NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps error:(NSError **)e
{
DeductionTablePrintViewController *pvc = [[DeductionTablePrintViewController alloc] initWithScopeDeduction:deduction andHelper:helper andDeductionController:self];
NSPrintInfo *printInfo = [self printInfo];
NSRect viewFrame = [[pvc view] frame];
viewFrame.size.width = [printInfo imageablePageBounds].size.width;
[[pvc view] setFrame:viewFrame];
NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:[pvc view] printInfo:printInfo];
return printOp;
}
DeductionTablePrintViewController
是NSViewController
的子类,严格用于打印。有一个相应的xib
文件。来自DeductionTablePrintViewController.h
(连接到xib
:
IBOutlet DeductionTable *deductionTable;
现在为DeductionTablePrintViewController.m
:
-(id)initWithScopeDeduction:(ScopeDeduction *)aDeduction andHelper:(DeductionHelper *)aHelper andDeductionController:(MyDocument *)aDeductionController
{
self = [super initWithNibName:@"DeductionTablePrintView" bundle:nil];
if (self) {
// Set deduction
deduction = [aDeduction copy]; // Deep copy
deductionController = aDeductionController; // MyDocument
[[(DeductionTablePrintView *)[self view] deductionTable] setDeduction:deduction];
}
return self;
}
-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)row
{
id objectValue = nil;
// objectValue is calculated here
... ... ...
return objectValue;
}
Here is the 'before' screenshot,打印预览中的表格数据(以及此处的打印输出)已正确填充。
Here is the 'after' screenshot,点击“Pages:From to”单选按钮后,打印预览中的表格数据(以及此处的打印输出)消失了。
答案 0 :(得分:0)
视图控制器正在由ARC解除分配,正如上面的Willeke所建议的那样(谢谢)。解决方案是添加到MyDocument.h:
DeductionTablePrintViewController *pvc;
然后将方法printOperationWithSettings
更改为:
-(NSPrintOperation *)printOperationWithSettings:(NSDictionary *)ps error:(NSError **)e
{
pvc = [[DeductionTablePrintViewController alloc] initWithScopeDeduction:deduction andHelper:helper andDeductionController:self];
.... ....
}
一旦指示物不再被取消分配,打印面板就会按预期工作。
其他信息:此问题的一个有趣方面是在打印面板出现后取消分配视图控制器,因此面板有时间创建打印预览,但之后无法访问表的数据。此外,我认为在视图控制器被释放后仍然出现公式,演绎标识符和tableview(见上图)的原因是,一旦将它们绘制到视图上,Print Dialog就不会尝试重绘它们。但是,打印面板通过调用tableView:objectValueForTableColumn:row
重复读取该表的数据。诊断此问题的进一步令人沮丧的尝试有两件事:(i)当打印面板在解除分配的视图控制器上调用tableView:objectValueForTableColumn:row
时,不会发出警告或错误,而是无声地失败; (ii)当我在tableView:objectValueForTableColumn:row
中插入断点时,调试器在向用户显示打印面板之前中断,但在取消分配视图控制器之后不会。后一种行为是有道理的,因为它被解除分配并且代码无法运行;但这让我相信打印面板仅在初始设置中向tableView:objectValueForTableColumn:row
发送了消息。