2015-06-27 50 views
23

这是奇怪的。我有一个简单的故事板占位符,其GridView为类名称属性。在NSView内部调用`print`会打开打印对话框

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 dialog

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

+2

您是否尝试删除'print'语句?可能是一个非常奇怪的错误... – luk2302

+0

哦哇!你是对的,'印刷'是它这样做的原因......这真是让人头晕目眩! –

+0

好吧,它应该不会这样做,打印应该做的事情完全不同...:D – luk2302

回答

21

调用print()做了一些不同的事情 - 更确切地说:如你所期望的那样。它调用NSView's print(sender: AnyObject?)而不是记录打印。你可以认为这是一个错误,或者至少是一个意想不到的行为,因为Swift.print(...)通常更多使用。

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

看看this post in the apple dev forum

事实上,它不是一个错误,因为调用print在当前上下文中“更接近”当然是正确的方法。调用父母的print比调用一些任意的其他print更合理。只有通常使用其他打印的事实是令人困惑的地方,因为一般来说,您不必担心日志记录print所处的范围 - 它只是起作用。如果你想另一种方式,并想要使用父母的打印print这将是一个lot更混乱,必须明确说明您要使用父母print而不是Swift.print(...)

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

+0

有趣的是,在你链接的页面中,人们认为这“绝对不是一个错误。':) –

+0

@MorganWilde是的,这就是为什么扩大我的答案 - 我可能想要删除“bug”这个词,因为这只是奇怪的,但有点合理的行为。 – luk2302

+2

这是一个错误。调试'print'比'print'可可打印方法用得多,所以框架应该做些什么。这只是糟糕的设计。 –

2

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

enter image description here

0

这是一个很老的线程,但我必须在这里,你可以这样写:

Swift.print("something") 

,你会使用“记录打印”功能,而不是观点的一个。