Как открыть панель NSSavePanel в FIFinderSync

#swift

Вопрос:

Я создаю расширение Finder, которое может создавать файл в выбранной папке.Я уже установил «Разрешение/доступ» для «Выбранного пользователем файла» в «Чтение/запись». Но панель не отображается.

введите описание изображения здесь

 override func menu(for menuKind: FIMenuKind) -gt; NSMenu {  // Produce a menu for the extension.  let menu = NSMenu(title: "")  menu.addItem(withTitle: "Example Menu Item", action: #selector(sampleAction(_:)), keyEquivalent: "")  return menu  }    @IBAction func sampleAction(_ sender: AnyObject?) {  let savePanel = NSSavePanel()  savePanel.canCreateDirectories = true  savePanel.showsTagField = false  savePanel.nameFieldStringValue = "newfile.txt"  savePanel.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.modalPanelWindow)))  savePanel.begin { (result) in  if result.rawValue == NSApplication.ModalResponse.OK.rawValue {  //write file  }  }  }  

И я поставил FIFinderSyncController.default().directoryURLs = [URL(fileURLWithPath: "/")]

Я нашел приложение с расширением Finder, такое как «Простой новый файл», которое может открыть панель сохранения. Как они этого достигают?

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

1. если (savePanel.runModel().rawValue == NSApplication. ModalResponse.OK.rawValue) {}

2. @ElTomato Это тоже не работает.

3. Что не работает?

4. @ElTomato savePanel.runModel() не отображает панель «Сохранить файл».

5. Я точно не знаю, как вы изменили код. Если вы измените код так, как я предложил, то это что-то другое, из-за чего панель не отображается.

Ответ №1:

Добавьте NSApp.activate(ignoringOtherApps: true) и DispatchQueue.main.async .

 NSApp.activate(ignoringOtherApps: true)  DispatchQueue.main.async {  let savePanel = NSSavePanel()  savePanel.directoryURL = URL(fileURLWithPath: target.path)  savePanel.canCreateDirectories = true  savePanel.showsTagField = false  savePanel.nameFieldStringValue = "newfile".localized  savePanel.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.modalPanelWindow)))  if (savePanel.runModal() == NSApplication.ModalResponse.OK),let url = savePanel.url{  //wirte file to url  }  }