在NSViewController和NSTableViewDelegate之间共享方法

时间:2015-11-19 23:32:24

标签: macos cocoa

我对cocoa框架存在架构问题。

所以问题是我的应用程序中有一个包含2个子视图的 MasterView

  • RecentFilesTableView ,其中包含用户最近使用的文件。用户将双击选择文件。
  • OtherFileView ,带有一个“打开另一个文件”按钮,可以调用NSOpenPanel。

两个视图都会调用end方法:openFileWithUrl(url:NSURL)

所以问题是:将这个存档的最佳(最多苹果)方式是什么?

解决方案1 ​​

我将方法 openFileWithUrl(url:NSURL)放在 MasterViewConroller

我的 RecentFilesTableDelegate 会引用 MasterViewConroller 并调用该方法。

我将 OtherFileView 的控制器放在 MasterViewConroller 中。

缺点:引用地狱(这个类引用它,引用它等等......)。

解决方案2

我将使用 MasterViewConroller 作为一个真正的控制器,它会在“最近的表”中双击并点击“打开另一个文件”按钮。

我必须以某种方式从 RecentFilesTableView 中获取所选文件。我没有看到这样做的方法(ofc。我可以将tableView.dataSource()转换为我的类。但我相信干净的设计不涉及这样的转换。)

缺点:一个人来统治他们。

解决方案3

由于我无法为RecentTableDelegate和MasterViewController创建超类,我可以使用Swift扩展为它们添加一个开放方法。但那不是很OOP。

那么Apple世界做这类事情的模式是什么?

1 个答案:

答案 0 :(得分:0)

由于您希望避免重复执行openFileWithUrl(url: NSURL),因此可以为NetworkManager这些类型的操作创建单独的类。这个解决方案与Apple的NSFileManager一致。当您需要执行该操作时,请创建该类的实例并调用该函数。