#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 без серьезных проблем. Было бы удобно, если бы путь был усечен и открывался при наведении курсора, как в окне поиска.