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

这很奇怪。我有一个简单的故事板占位符和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()
    }
}

这只是在实现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

事实上,这不是一个错误,因为调用当前上下文中“更接近”的打印肯定是正确的方法。调用父母的印刷品比调用一些任意的其他印刷品更合理。只有您通常使用其他打印件的事实才是令人困惑的事实,因为一般情况下您不必担心日志打印所在的范围 – 它只是起作用。如果您认为反过来并且想要使用父级的打印打印,那么必须明确声明您要使用parent print而不是Swift.print(…)会更加困惑。

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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...