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

Calling `print` inside NSView opens print dialog

这很奇怪。我有一个简单的故事板占位符,其中 GridView 用于 class name 属性。

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()
    }
}

drawRect 实现,这按预期工作,但在我添加初始化程序后,每次我 运行 应用程序时它都会开始打开打印对话框。

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

调用 print() 会做一些它应该做的不同的事情——更准确地说:做一些与你期望的不同的事情。它调用 NSView's print(sender: AnyObject?) 而不是日志打印。您可以将此视为错误或至少是非常意外的行为,因为 Swift.print(...) 通常使用得更多。

This action method opens the Print panel, and if the user chooses an option other than canceling, prints the receiver and all its subviews to the device specified in the Print panel.

看看this post in the apple dev forum

事实上,这不是错误,因为在当前上下文中调用 "closer" 的 print 肯定是正确的方法。调用 parent 的 print 比调用任意其他 print 合理得多。只有你通常使用 other 打印的事实才是这里的混淆点,因为通常你不必担心日志记录 print 位于什么范围 - 它只是工作。如果你反过来想并且想要使用你的 parent 的打印 print 它将是 lot 更令人困惑的是必须明确声明您要使用 parents print 而不是 Swift.print(...).

唯一的 "solution" 是为这两个函数使用不同的名称,这可能不会发生。

它调用打印对话框的原因是 Swift 2 显然有两个具有相同签名的方法。

这是一个很老的帖子,但我必须在这里补充一点,你可以写:

Swift.print("something")

并且您将使用 "log print" 函数而不是视图的函数。