2017-07-21 86 views
2

我很新的迅速,從C++來沒有的OBJ-C的背景下,我無法找到和優雅的解決一個小問題...NSOpenPanel繼承和「指定初始化」

我使用NSOpenPanel檢索一些文件的URL。

我的代碼看喜歡的是:

let import_panel = NSOpenPanel() 
import_panel.allowsMultipleSelection = true; 
import_panel.canChooseDirectories = false; 
import_panel.canCreateDirectories = false; 
import_panel.canChooseFiles = true; 
let import_panel_delegate = ImportPanelDelegate.init() 
import_panel.delegate = import_panel_delegate 
import_panel.prompt = NSLocalizedString("IMPORT_BUTTON_TEXT", comment: "") 
let i = import_panel.runModal(); 

我想在我的應用程序的幾個地方使用這種進口面板,所以我首先想到的是子類NSOpenPanel創建「ImportPanel」。

class ImportPanel : NSOpenPanel{ 
    init() 
    { 
    super.init() 
    self.allowsMultipleSelection = true 
    self.canChooseDirectories = false 
    self.canCreateDirectories = false 
    self.canChooseFiles = true 
    self.delegate = ImportPanelDelegate.init() 
    self.prompt = NSLocalizedString("IMPORT_BUTTON_TEXT", comment: "") 
    } 
} 

在這裏,我面臨一個編譯錯誤,告訴我應該使用NSOpenPanel的「指定初始值設定項」。 如果我理解的很好,指定的初始值設定項是一個顯式設定多個參數的初始值設定項。 但是在這裏,我不知道使用哪個初始化器。而且,我不知道如何爲這些不同的初始化器填充參數!我知道Swift比「面向對象的編程」更多的是「面向協議的編程」,所以也許子類化NSOpenPanel不是正確的解決方案,但我不知道如何在這裏使用協議。因此,如果我想專門化一個NSOpenPanel,我該怎麼做呢?

感謝提前!

回答

1

這不是一般的答案,它是特定於NSOpenPanelNSSavePanel只有,永不要企圖繼承這兩個類

這兩個類是特殊的,因爲它們是沙盒實現的一部分,與它們混淆並且事情往往會破壞。

而不是子類化(或者,正如你所提到的,協議 - 儘管你可能在任何地方都可以看到,它們並不是所有東西的答案;-))設計一個類型(類或結構體)來包裝這些類並提供功能你需要。即使用「有一個」而不是「是一個」。

或者,您可以編寫創建或採取其中某個類的實例並執行所需自定義的函數。即甚至沒有「有」,但只需使用其標準API自定義實例。

每種方法都是同樣有效的,可以選擇適合用例的任何一種。

HTH

+0

優秀的建議。來自各種Apple文檔的資源:「在沙盒環境中,Open Panel由Powerbox獨立繪製,而不是由AppKit本身繪製」,而「NSOpenPanel或NSSavePanel對象通過App Sandbox繼承更少的方法」,因爲「NSOpenPanel的運行時繼承路徑和NSSavePanel類與App Sandbox不同「。在這種情況下,子類化可能不會導致預期的結果。 – Moritz

+0

在類擴展中添加一個方便的方法是個好主意嗎? – Willeke

+0

@Willeke - 不,他們也不是個好主意。 – CRD