我很新的迅速,從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,我該怎麼做呢?
感謝提前!
優秀的建議。來自各種Apple文檔的資源:「在沙盒環境中,Open Panel由Powerbox獨立繪製,而不是由AppKit本身繪製」,而「NSOpenPanel或NSSavePanel對象通過App Sandbox繼承更少的方法」,因爲「NSOpenPanel的運行時繼承路徑和NSSavePanel類與App Sandbox不同「。在這種情況下,子類化可能不會導致預期的結果。 – Moritz
在類擴展中添加一個方便的方法是個好主意嗎? – Willeke
@Willeke - 不,他們也不是個好主意。 – CRD