【问题标题】:Calling `print` inside NSView opens print dialog在 NSView 中调用 print 会打开打印对话框
【发布时间】:2015-06-27 10:19:22
【问题描述】:

这很奇怪。我有一个简单的故事板占位符,其中 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 语句?可能是一个非常奇怪的错误...
  • 哇哦!你是对的,print 是它这样做的原因......这真是令人难以置信!
  • 好吧,它不应该那样做,打印应该做一些完全不同的事情......:D

标签: macos swift swift2


【解决方案1】:

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

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

看看this post in the apple dev forum

实际上这不是错误,因为在当前上下文中调用“更接近”的print 肯定是正确的方法。调用父母的print 比调用任意其他print 更合理。只有您通常使用 other 打印的事实是这里令人困惑的一点,因为通常您不必担心日志记录 print 位于什么范围内 - 它可以正常工作。如果您反过来想并想使用您父母的打印print,那么必须明确声明您要使用的很多会更加混乱父母print 而不是Swift.print(...)

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

【讨论】:

  • 有趣的是,在您链接的页面上的线程中,人们认为这是certainly not a bug. :)
  • @MorganWilde 是的,这就是为什么扩展我的答案 - 我可能想删除“错误”这个词,因为这样做很奇怪但有点合理。
  • 这是一个错误。调试printprint Cocoa 打印方法使用得更多,所以框架应该对此做一些事情。这只是糟糕的设计。
  • @MorganWilde 有点像,但仅从编译器的角度来看,这并不是一个真正的错误,因为调用您当前所在对象的打印实际上是更正确的方法,而不是调用一些随机的静态打印在其他地方定义。
  • 当然,这不是编译器的问题,而是这些 Cocoa 类的 print 方法需要更改。恕我直言
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是一个相当古老的线程,但我必须在这里补充一下,你可以写:

    Swift.print("something")
    

    您将使用“日志打印”功能而不是视图的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多