单击图标时 SwiftUI NSPathControl 打开查找器位置

SwiftUI NSPathControl open finder location when clicking icons

我已经包装了 NSPathControl 以便在我的 Mac OS SwiftUI 应用程序中使用,但我无法弄清楚如何使路径的大小更小或如何获得单独的路径单击时在 Finder 中打开位置。

这是包装纸:

struct PathView: NSViewRepresentable {
    typealias pathViewNSView = NSPathControl
    var configuration = { (view: pathViewNSView) in }
    
    func makeNSView(context: NSViewRepresentableContext<PathView>) -> NSPathControl {
        pathViewNSView()
    }
    func updateNSView(_ nsView: NSPathControl, context: NSViewRepresentableContext<PathView>) {
        configuration(nsView)
    }
}

我是这样使用视图的:

PathView { view in
    view.url = URL(fileURLWithPath: "/Volumes/Users/myfolder", isDirectory: true)
}

我知道使用 NSWorkspace.shared.selectFile 在 Finder 中打开路径,但不确定如何使用包装的 NSPathControl 执行此操作。

您可以将 Coordinator 模式与 NSViewRepresentable 一起使用:

struct PathView: NSViewRepresentable {
    var configuration = { (view: NSPathControl) in }
    
    func makeNSView(context: NSViewRepresentableContext<PathView>) -> NSPathControl {
        let pathControl = NSPathControl()
        pathControl.target = context.coordinator
        pathControl.action = #selector(Coordinator.action)
        return pathControl
    }
    func updateNSView(_ nsView: NSPathControl, context: NSViewRepresentableContext<PathView>) {
        configuration(nsView)
    }
    
    func makeCoordinator() -> Coordinator {
        return Coordinator()
    }
    
    class Coordinator : NSObject, NSPathControlDelegate {
        @objc func action(sender: NSPathControl) {
            if let url = sender.clickedPathItem?.url {
                print(url)
                NSWorkspace.shared.selectFile(url.path, inFileViewerRootedAtPath: url.path)
            }
        }
    }
}

注意:我实际上并没有使用任何 NSPathControlDelegate 方法——这只是为了表明它也可以扩展为委托