1

我在 SwiftUI 中开发了一个 macOS 个人理财应用程序,它通过NSViewControllerRepresentableSwiftUI 和 AppKit 之间的接口使用 NSTableViews 和 NSOutlineViews。

我发现 AppKit 视图功能远远优于我可以使用 SwiftUI 列表创建的任何东西,而且它们运行得更快并且支持 TypeSelect。将数据传递到 Appkit ViewControllers 很简单,但获取信息似乎不那么简单。

Apple 开发人员文档建议我应该使用一个Coordinator类,我曾尝试这样做但无济于事。我需要的委托方法 ( func tableViewSelectionDidChange(_ notification: Notification)) 无法运行(从我的Coordinator班级内部)。

目前我正在交换数据和操作NotificationCenter.default,并且效果很好,但我热衷于使用“官方”方法。我找到了一个成功使用 Coordinator 的 macOS 应用程序(在https://www.markusbodner.com/til/2021/02/08/multi-line-text-field-with-swiftui-on-macos/)但我不能让我的Coordinator班级正常工作,NSTableViewDelegate即使它构建和运行时没有错误(Xcode 12.4)。

我首先要做的就是获取一个NSViewController包含 a 的 aNSTableView以通过 a 将其传递NSTableView.selectedRow到其父 SwiftUI 视图中Coordinator,每当用户在 NSTableView 中选择一个新行时。任何人都可以帮忙(如果可能的话,请提供一些示例代码)?

4

1 回答 1

0

我似乎找到了解决我自己问题的方法。我一直在将我分配NSTableViewDelegate给该makeNSViewController功能的协调员。但是,在填充 my 内容的代码运行(在函数中)之前,似乎 myNSTableView没有被实例化。结果没有分配。NSTableViewNSTableViewDataSourceupdateNSViewControllerNSTableViewDelegate

tableVC.tableView?.delegate = context.coordinator进入updateNSViewController函数,按照填充 my 内容的代码NSTableViewDataSource,使我的NSTableViewDelegate工作按预期进行,并且tableView.selectedRow值现在通过成功传递给我的父 SwiftUI视图func tableViewSelectionDidChange(_ notification: Notification)。欢呼!

注意到我在我的中使用 Cocoa 绑定可能很有用,NSTableView并且发现有必要@IBAction func在 ViewController(文件所有者)中保留空存根(按 ctrl 拖动窗体接口生成器)并放置这些函数的副本(当然,在我的 Coordinator 类中填充了代码,以使他们的代码按预期执行。

生成的整体代码比我的旧代码简洁得多,旧代码使用通知在 SwiftUI 和 AppKit 之间传递操作和数据 - 所以“官方”方法看起来是最好的。

于 2021-02-28T20:54:54.963 回答