2015-06-27 51 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") 

,你會使用「記錄打印」功能,而不是觀點的一個。