#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 } }