SwiftUI NSPathControl открывает местоположение finder при нажатии на значки

#macos #swiftui #appkit #nspathcontrol

Вопрос:

Я завернул NSPathControl для использования в своем приложении SwiftUI для Mac OS, но я не могу понять, как уменьшить размеры пути или как заставить отдельные пути открывать местоположение в Finder при нажатии.

Вот обертка:

 struct PathView: NSViewRepresentable {  typealias pathViewNSView = NSPathControl  var configuration = { (view: pathViewNSView) in }    func makeNSView(context: NSViewRepresentableContextlt;PathViewgt;) -gt; NSPathControl {  pathViewNSView()  }  func updateNSView(_ nsView: NSPathControl, context: NSViewRepresentableContextlt;PathViewgt;) {  configuration(nsView)  } }  

Я использую такой вид:

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

Я знаю, что нужно использовать файл NSWorkspace.shared.select для открытия пути в Finder, но не уверен, как это сделать с помощью обернутого NSPathControl.

Ответ №1:

Вы можете использовать Coordinator шаблон с NSViewRepresentable :

 struct PathView: NSViewRepresentable {  var configuration = { (view: NSPathControl) in }    func makeNSView(context: NSViewRepresentableContextlt;PathViewgt;) -gt; NSPathControl {  let pathControl = NSPathControl()  pathControl.target = context.coordinator  pathControl.action = #selector(Coordinator.action)  return pathControl  }  func updateNSView(_ nsView: NSPathControl, context: NSViewRepresentableContextlt;PathViewgt;) {  configuration(nsView)  }    func makeCoordinator() -gt; 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 методов-это просто для того, чтобы показать, что он также может быть расширен до делегата

Комментарии:

1. Вау, это очень ценно — я изучу шаблон координатора сегодня вечером!

2. Посмотрев, я обнаружил, что не могу реально повлиять на размер представления PathControl без серьезных проблем. Было бы удобно, если бы путь был усечен и открывался при наведении курсора, как в окне поиска.