NSOpenPanel继承和“指定初始化程序”

时间:2017-07-21 09:57:46

标签: swift cocoa

我是swift的新手,来自没有Obj-C背景的C ++,我找不到优雅的解决方案来解决一个小问题......

我使用NSOpenPanel来检索一些文件网址。

我的代码看起来像是:

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 个答案:

答案 0 :(得分:2)

这不是一般性答案,它仅针对NSOpenPanelNSSavePanel 永远不会尝试将这两个类子类化

这两个类是特殊的,因为它们是沙盒实现的一部分,混乱它们,事情往往会破坏。

而不是子类化(或者,正如你所提到的,协议 - 尽管你可能在任何地方读到的东西都不是答案;-))设计一个类型(类或结构)来包装这些类并提供你的功能需要。即使用“有一个”而不是“是一个”。

或者,您可以编写创建或获取其中一个类的实例的函数,并执行所需的自定义。即甚至没有“拥有”,只是使用其标准API自定义实例。

每种方法都同样有效,选择适合用例的方法。

HTH