在NSView中调用`print`打开打印对话框

Mor*_*lde 23 macos swift swift2

这很奇怪.我有一个简单的故事板占位符,GridView用于类名属性.

class GridView: NSView {

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        print("coder: \(coder)")
    }

    override func drawRect(dirtyRect: NSRect) {
        let rect = NSBezierPath(rect: dirtyRect)
        NSColor.redColor().setFill()
        rect.fill()
    }
}
Run Code Online (Sandbox Code Playgroud)

刚刚drawRect实现了这个功能,但是在我添加了初始化程序后,每次运行应用程序时都会打开打印对话框.

打印对话框

为什么会发生这种情况?如何为自定义视图正确重新实现故事板初始化器?

luk*_*302 21

呼叫print()做了不同的事情 - 更准确地说:正如你所期望的那样不同.它调用NSViewprint(sender: AnyObject?),而不是记录打印.您可以将此视为一个错误或至少是非常意外的行为,因为Swift.print(...)通常使用得更多.

此操作方法将打开"打印"面板,如果用户选择取消以外的选项,则将接收器及其所有子视图打印到"打印"面板中指定的设备.

在apple dev论坛中查看这篇文章.

实际上它不是一个bug,因为print在当前上下文中调用"更接近"肯定是正确的方法.调用父母的print内容比调用其他任意内容更合理print.只有你通常使用其他打印的事实才是令人困惑的一点,因为一般来说你不必担心日志记录的范围print- 它只是起作用.如果你觉得周围的其他方法和将要使用的打印print你的父母,这将是一个很大较为混乱有明确说明您要使用的父母print,而不是Swift.print(...).

唯一的"解决方案"是为这两个函数使用不同的名称,这可能不会发生.

  • 这是一个错误.调试`print`比`print` Cocoa打印方法使用得多,所以框架应该做些什么.这只是糟糕的设计. (2认同)