更改打印面板设置后,NSTableView数据消失

时间:2017-05-13 06:32:06

标签: ios objective-c nstableview nsview nsprintoperation

我正在尝试通过自定义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;
}

DeductionTablePrintViewControllerNSViewController的子类,严格用于打印。有一个相应的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;
}

1 个答案:

答案 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发送了消息。