gpt4 book ai didi

swift - 将永远不会改变的对象传递给 NSWindowController 的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 12:51:39 26 4
gpt4 key购买 nike

我有一个 NSWindowController,它显示一个表格并使用另一个 Controller 作为 NSTableView 的数据源和委托(delegate)。第二个 Controller 显示来自对象的信息,该对象由 NSWindowController 传入。该 Controller 又将对象设置为 AppDelegate 的属性。它看起来像这样:

class SomeWindowController: NSWindowController {
var relevantThing: Thing!
var someTableController: SomeTableController!
@IBOutlet weak var someTable: NSTableView!

override func windowDidLoad() {
someTableController = SomeTableController(thing: relevantThing)
someTable.dataSource = someTableController
someTable.delegate = someTableController
}
}

AppDelegate 中,我会执行类似的操作

func applicationDidFinishLaunching(_ aNotification: Notification) {
relevantThing = Thing()
someWindowController = SomeWindowController()
someWindowController.relevantThing = relevantThing
someWindowController.showWindow(nil)
}

这是一个合理的方法吗?我觉得 SomeWindowController 中使用的隐式展开的选项可能是不好的形式。另外,在我的情况下,relevantThing 不允许更改,所以我觉得 let 会更正确。也许应该将 relevantThing 设置为常量并通过初始化器传入?或者这会破坏 init?(coder: NSCoder) 初始化程序吗?

我非常感谢任何建议,因为我正在尝试了解在 Swift 中做事的正确方法。

最佳答案

一些事情:

您在代码中创建窗口 Controller 而不是从 Storyboard/xib 加载它有什么原因吗?

通常,更好的做法是将与 View 相关的所有“ Controller ”放入 NSViewController 中,并仅将 NSWindowController 用于与窗口本身相关的内容(例如工具栏、窗口管理等)。

与 iOS 类似,NSViewController 现在已集成到窗口/ View 生命周期和响应程序链中。对于许多窗口,您甚至不需要子类化 NSWindowController

XCode 的应用程序项目模板创建一个带有窗口、主视图及其 Controller 的 Storyboard。这是一个很好的起点。

NSWindowController 有一个 contentViewController 属性,该属性设置为主内容 View 的 NSViewController(当从 Storyboard 加载时)。您的 View Controller 通常不需要单独的 View Controller 属性。

我认为通常情况下,您希望尽量减少从外部代码修改 Controller ,并使它们尽可能独立。这使得它们更易于测试和重用。

如果您的 Thing 实例对于整个应用程序来说是全局的(如代码所示),您可能需要考虑将其作为单例实例添加到 Thing类并从 NSViewController 检索它(例如在 viewDidLoad() 中)

如果您将 Controller / View 放在 Storyboard中,则可以在那里连接表的数据源/委托(delegate)。如果这是您的主窗口,它可以在应用程序启动时自动加载并显示它。但无论如何,请将您的 NSViewController/View 接线放入 View Controller 中。

如果你想将主 NSViewController 之间的逻辑分离成一个更专门的 View Controller 来处理 View 的特定部分,你可以使用 Interface Builder 中的 NSContainerView 来添加额外的 View Controller 来处理特定的部分。意见。

关于swift - 将永远不会改变的对象传递给 NSWindowController 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40877692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com