【问题标题】:Using NSTableView in SwiftUI?在 SwiftUI 中使用 NSTableView?
【发布时间】:2019-11-26 18:06:05
【问题描述】:

有没有人让NSTableView 使用 SwiftUI?每当我运行我的代码时,我的应用程序都不会加载,但也没有错误。没有表格视图的任何示例,但我认为它会使用NSViewControllerRepresentable。我不完全确定您如何设置表格样式并将其添加到视图中。感谢您的帮助!

struct SampleViewController: NSViewControllerRepresentable {
    
    var tableView:NSTableView = {
        let table = NSTableView(frame: .zero)
        table.rowSizeStyle = .large
        table.backgroundColor = .clear
        return table
    }()
    
    func makeNSViewController(context: Context) -> NSViewController {
        
        return NSViewController()
    }
    
    func updateNSViewController(_ nsViewController: NSViewController, context: Context) {
        //tbd
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, NSTableViewDataSource, NSTableViewDelegate {
        var parent: SampleViewController
        
        init(_ tvController: SampleViewController) {
            self.parent = tvController
        }
        
        func numberOfRows(in tableView: NSTableView) -> Int {
            return 10
        }
        
        func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
            return nil
        }
        
        func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
            return CGFloat(90)
        }
        
        func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
            return false
        }

    }

    
}


struct SampleView: View {
    var body: some View {
        SampleViewController()
    }
}

【问题讨论】:

  • 你试过 NSViewRepresentable 吗?我没有尝试任何一个,但我会从这个开始。
  • 我首先尝试了 NSViewRepresentable,在苹果的示例 (developer.apple.com/tutorials/swiftui/interfacing-with-uikit) 中,他们使用可表示的控制器来控制页面。我认为这将是最接近的,因为他们还必须实现委托方法
  • 那里有UIPageViewController,但NSTableView 是视图。那么目标是什么?这是可能的,但要使其功能齐全,需要大量的手动工作。因此,最好在故事板中准备所需的自定义控制器来管理所需的一切,然后将其包装在 UIViewControllerRepresentable 中。
  • 你需要先制作一个带有table的MacOS应用。然后你就可以熟悉转移到swiftUI了。第二部分并不难。但是第一部分是不同的,因为 NSTableView 的行为与 UITableView 不同。
  • @Asperi 的目标是拥有一个功能齐全的 TableView,类似于我在情节提要中拥有的。我可以在故事板中很好地制作它,但想看看我是否可以删除一些故事板格式并将其移动到 SwiftUI。所以你建议在 storyboard 中创建 ViewController 并在 ViewController 类中包含所有上述协调器功能,然后将所有这些包装在 NSViewControllerRepresentable 中以在整个应用程序中使用?

标签: swift swiftui appkit


【解决方案1】:

我有一种感觉,您可能已经想到了这一点,但您实际上并没有将 tableView 属性设置为视图控制器的 view。因此,当呈现时,您的 SwiftUI 视图将由一个普通的 NSView 支持。

在这个特定的示例中,我认为NSViewRepresentable 可能会更好,因为您的控制器无论如何都没有逻辑。

以防万一这有帮助,要记住的另一件事是协调器的角色及其与parent 属性的关系。因为协调器是创建和重用的,所以如果重新创建 SwiftUI 视图,它的parent更新。当我试图在func updateNSViewController(_ nsViewController: NSViewController, context: Context) 中重新加载表数据时,这真的让我感到困惑

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 2014-06-27
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2020-05-25
    相关资源
    最近更新 更多