Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos NSPrintOperation上下文始终为零,导致崩溃。打印时如何设置上下文?_Macos_Printing_Nsprintoperation - Fatal编程技术网

Macos NSPrintOperation上下文始终为零,导致崩溃。打印时如何设置上下文?

Macos NSPrintOperation上下文始终为零,导致崩溃。打印时如何设置上下文?,macos,printing,nsprintoperation,Macos,Printing,Nsprintoperation,我有一个要打印的自定义NSView。在使用NSView和打印选项进行设置后,我打电话: NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView: printView printInfo: printInfo]; [NSPrintOperation setCurrentOperation: printOperation]; [printView beginDocument]; NSGraphicsC

我有一个要打印的自定义NSView。在使用NSView和打印选项进行设置后,我打电话:

NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView: printView printInfo: printInfo];

[NSPrintOperation setCurrentOperation: printOperation];
[printView beginDocument];

NSGraphicsContext* theContext = printOperation.context;
[printView beginPageInRect: rect atPlacement: location];
上下文总是零。如果我忽略了这一点,当我打电话时:

NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView: printView printInfo: printInfo];

[NSPrintOperation setCurrentOperation: printOperation];
[printView beginDocument];

NSGraphicsContext* theContext = printOperation.context;
[printView beginPageInRect: rect atPlacement: location];
我得到一个异常,说:[General]lockFocus/unlockFocus发送到一个不在窗口中的视图

如果我对此进行注释,我会收到大约10亿条这样的消息:CGContextDrawPath:invalid context 0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。打开“回溯”只会显示我所有的绘图都是导致它的原因

如果查看视图的DrawRect:函数中的图形上下文:

NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext];
CGContextRef      context = [[NSGraphicsContext currentContext] graphicsPort];
graphicsContext和context均为零

那么,我必须做什么才能获得有效的打印上下文呢?我看到有一个NSPrintOperation方法createContext,但是文档说不要直接调用它,如果我忽略了它,它就没有帮助了,会向打印机发送大约8个空作业

代码的最新版本,仍然会导致空上下文:

NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView: printView printInfo: printInfo];

[printView setCurrentForm: [formSet objectAtIndex: 0]];

NSInteger pageCounter = 0;
formHeight = 0;
formWidth = 0;

for (AFVForm *oneForm in formSet)
{
    printView.verticalOffset = formHeight;
    NSRect  rect = NSMakeRect(0, 0, oneForm.pageWidth, oneForm.pageHeight);
    NSPoint location = [printView locationOfPrintRect: rect];

    formHeight += [oneForm pageHeight];
    if ([oneForm pageWidth] > formWidth)
        formWidth = [oneForm pageWidth];
    pageCounter++;
    printView.currentForm = oneForm;
    [printView setPrintMode: YES];

    [printView drawRect: NSZeroRect];

    [printView setPrintMode: NO];
}

[printOperation setShowsPrintPanel:YES];
[printOperation runOperationModalForWindow: [self window] delegate: nil didRunSelector: nil contextInfo: nil];
beginDocument和beginPageInRect:atPlacement:在打印会话开始时和每页开始时调用。如果需要,请重写这些方法,但不要调用它们。不要调用setCurrentOperation,只需创建一个NSPrintOperation并调用runOperation或runOperationModalForWindow:delegate:didRunSelector:contextInfo:

编辑,例如:

PrintView.h

@interface PrintView : NSView

@property (strong) NSArray *forms;

@end
PrintView.m

@interface PrintView ()

@property (weak) NSTextField *titleField;
@property (weak) NSDictionary *currentForm;

@end


@implementation PrintView

- (instancetype)initWithFrame:(NSRect)frameRect {
    if (self = [super initWithFrame:frameRect]) {
        // add a title text field
        NSTextField *textField = [[NSTextField alloc] initWithFrame:NSMakeRect(25.0, 225.0, 250.0, 25.0)];
        textField.alignment = NSTextAlignmentCenter;
        [self addSubview:textField];
        self.titleField = textField;
    }
    return self;
}

- (BOOL)knowsPageRange:(NSRangePointer)range {
    range->location = 1;
    range->length = self.forms.count;
    return YES;
}

- (NSRect)rectForPage:(NSInteger)page {
    return self.bounds;
}

- (void)beginPageInRect:(NSRect)rect atPlacement:(NSPoint)location {
    [super beginPageInRect:rect atPlacement:location];
    NSPrintOperation *printOperation = [NSPrintOperation currentOperation];
    self.currentForm = self.forms[printOperation.currentPage - 1];
    // set the title
    [self.titleField setStringValue:
        [NSString stringWithFormat:@"Form ‘%@’ page %li",
            self.currentForm[@"title"], (long)printOperation.currentPage]];
}

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
    // Drawing code here.
    // draw a colored frame
    NSColor *formColor = self.currentForm[@"color"];
    NSRect rect = self.bounds;
    NSInsetRect(rect, 20.0, 20.0);
    [formColor set];
    NSFrameRect(rect);
}

@end
其他地方

- (IBAction)printAction:(id)sender {
    PrintView *printView = [[PrintView alloc] initWithFrame:NSMakeRect(0.0, 0.0, 300.0, 300.0)];
    printView.forms = @[
            @{@"title":@"Form A", @"color":[NSColor redColor]},
            @{@"title":@"Form B", @"color":[NSColor greenColor]},
            @{@"title":@"Form C", @"color":[NSColor blueColor]},
        ];
    NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:printView];
    [printOperation setShowsPrintPanel:YES];
    [printOperation runOperationModalForWindow:[self window] delegate:nil didRunSelector:NULL contextInfo:NULL];
}

NSView子类中有一个Swift示例。如果没有帮助,我道歉:

         func letsPrint() {
             let pInfo = NSPrintInfo.shared
             let d = pInfo.dictionary()
             d["NSLastPage"] = 1
             super.printView(self)
         }
         override func knowsPageRange(_ range: NSRangePointer) -> Bool {
             return true
         }
         override func rectForPage(_ page: Int) -> NSRect {
             if page > 1 { return NSZeroRect }
             return NSRect(x: 0, y: 0, width: 612, height: 792)
         }
本例打印1页,8.5 x 11,因此使用rectForPage中的常量


letsPrint连接到应用程序菜单first responder。

我已经一遍又一遍地阅读了编程指南,但找不到任何解释上下文为零的内容。我修改了代码以反映您的建议,同样的事情-上下文为nil,并且我得到一堆CGContextDrawPath:invalid context 0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。由于空上下文。@DaleJensen您是否删除了[printView beginDocument];和[printView beginPageInRect:rect atPlacement:location];?请在问题中贴一个,这不是一个很好的例子。knowsPageRange返回true,范围是多少?最好使用NSPrintInfo.AttributeKey.lastPage而不是NSLastPage。为什么要设置d[NSLastPage]?super.printView而不是self.printView?预览显示了一个活动的>按钮。解决了它-视图在runOperationModalForWindow:期间绘制,上下文设置正确,这意味着整个AFVForm*oneForm在formSet部分是不必要的,是导致所有错误的原因。去掉它,问题就解决了。